首页 文章

关于删除链表中最后一个节点的困惑

提问于
浏览
0

删除最后一个节点的逻辑如下:

转到节点的指针,它的下一个是 NULL 然后释放它,对吧?我试图在一个函数中实现这个逻辑:

node* Delete_Last(node*head){
   node* i=head;
   while (i->next!=NULL){
      i=i->next;
   }
   free(i);
   i=NULL;
   return head;
}

当我尝试打印列表时,我不能 - 这是一个无限循环 . 你能告诉我逻辑中的缺陷是什么以及如何纠正它吗?

1 回答

  • 2

    不,不对 . 您还必须更新上一个节点的下一个节点,如果head是最后一个节点,则前进 . 所以首先你应该把指针指向头部指针,你需要这个以防万一你需要更新头部 . 其次,因为它是单链表,你应该保留上一个节点:

    node* Delete_Last(node** head) {
        if (!*head) {
            return 0;
        }
    
       node* i = *head, *previous = 0;
       while (i->next){
          previous = i;
          i = i->next;
       }
       free(i);
       if (previous) {
           previous->next = 0;
       } else {
           *head = 0;
       }
       return previous;
    }
    

    我不知道你想要什么返回,所以我假设你的代码是新的结束,再回头也没有意义 . 现在你可以用以下方法调用:

    node* prevLast = Delete_Last(&head);
    

相关问题