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

时间:2018-05-16 14:40:03

标签: c data-structures

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

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

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

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

1 个答案:

答案 0 :(得分: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);