C语言链表尾节点删除函数错误求助:求正确实现方案
解决链表尾节点删除的C语言实现问题
我来帮你搞定这个链表尾节点删除的问题!先拆解你之前两段代码的错误,再给你实现完全符合你思路的正确代码。
先分析你两段代码的问题
第一段代码的错误
struct node *del_the_last(struct node *head) { struct node *h1 = head; if (head == NULL) { return NULL; } while (head->next != NULL) { head = head->next; } free(h1); return head; }
这段代码的核心问题有两个:
- 你释放的是原头节点(
h1保存的是初始head),而不是尾节点,这会导致整个链表的头被销毁,剩下的节点都变成野指针; - 你没有修改倒数第二个节点的
next指针,就算遍历到了尾节点,也没法把它从链表中移除。
测试返回[12]只是因为最后head指向了原尾节点,但此时前面的所有节点都已经被释放,这个结果是完全错误的。
第二段代码的错误
struct node *del_the_last(struct node *head) { struct node *h1 = head; int flag = 1; if (head == NULL) { return NULL; } while (flag == 1) { if (head->next->next == NULL) { flag = 0; head->next = NULL; free(h1); return head; } else { head = head->next; } } }
这段代码的问题:
- 同样错误地释放了原头节点(
h1),导致整个链表的头被销毁; - 最后返回的是
head,而此时head已经移动到了倒数第二个节点,所以测试返回1(原链表的倒数第二个值),不符合返回原头指针的预期; - 没有释放原尾节点,造成内存泄漏。
符合你思路的正确实现
你的思路完全正确,核心就是要保留原头指针,操作完成后返回它。下面是具体的C代码实现(假设你的节点结构定义如下):
首先,节点结构定义:
struct node { int data; struct node *next; };
删除尾节点的函数:
struct node *del_the_last(struct node *head) { // 步骤1:保存原始头指针到变量 struct node *original_head = head; // 空链表直接返回NULL if (head == NULL) { return NULL; } // 链表只有一个节点的情况:释放该节点,返回NULL if (head->next == NULL) { free(head); return NULL; } // 步骤2:正常执行逻辑——找到倒数第二个节点 while (head->next->next != NULL) { head = head->next; } // 此时head是倒数第二个节点,head->next就是要删除的尾节点 struct node *tail_node = head->next; // 断开尾节点与链表的连接 head->next = NULL; // 步骤4:释放尾节点 free(tail_node); // 步骤3:将head重新赋值为原始头指针 head = original_head; // 步骤5:返回原始头指针 return head; }
代码逻辑说明
- 保存原头指针:用
original_head存储初始的head,确保最后能返回正确的链表头; - 边界情况处理:空链表直接返回;单个节点时释放后返回NULL;
- 找到倒数第二个节点:通过
head->next->next != NULL的条件遍历,避免直接走到尾节点后无法回溯; - 删除尾节点:断开连接后释放尾节点,避免内存泄漏;
- 返回原头指针:最后把
head重置为original_head,返回正确的链表头。
用你的测试用例验证:
- 输入
16,7,8,12,13,19,21,12:删除尾节点12后,返回原头指针,链表变为16,7,8,12,13,19,21; - 输入
2,7,1,8:删除尾节点8后,返回原头指针,链表变为2,7,1,完全符合预期。
内容的提问来源于stack exchange,提问作者oAUTHo123
相关产品推荐
相关产品推荐

