如何在C++中仅用尾指针删除循环单链表的尾节点?求代码修正
修正循环单链表的deleteEnd()函数(仅使用尾指针)
错误原因分析
你的deleteEnd()函数存在两个核心问题:
- 循环逻辑错误:原代码的循环条件
while (temp1->next != last)会让遍历停在倒数第二个节点(比如示例中的4),最终删除的是这个节点而非尾节点(3)。 - 参数传递问题:函数参数为
struct node* last是传值调用,修改last的指向(比如单节点时设为NULL)无法同步到外部的尾指针,同时删除尾节点后也没有更新尾指针指向新的尾节点。
修正后的代码
struct node { int data; struct node* next; }; void deleteEnd(struct node** last) { // 空链表直接返回 if (*last == NULL) return; // 链表只有一个节点的情况 if ((*last)->next == *last) { delete *last; *last = NULL; return; } // 找到尾节点的前一个节点 struct node* temp = *last; while (temp->next != *last) { temp = temp->next; } // 跳过原尾节点,重新指向头节点 temp->next = (*last)->next; // 删除原尾节点 delete *last; // 更新尾指针为新的尾节点 *last = temp; }
关键修正点说明
- 参数改为指针的指针:
struct node** last可以让函数直接修改外部的尾指针指向,解决传值调用的问题。 - 正确定位前序节点:通过
while (temp->next != *last)找到原尾节点的前一个节点(示例中的4),确保要删除的是尾节点(3)。 - 更新尾指针:删除原尾节点后,将尾指针指向新的尾节点(原尾节点的前一个节点),保证循环链表的结构正确。
测试示例验证
原链表:6->5->4->3->(循环)(尾指针last指向3)
执行修正后的deleteEnd()后:
- 找到前序节点4
- 4的
next指向3的next(即6) - 删除节点3
- 尾指针更新为4
最终链表变为6->5->4->(循环),符合预期。
内容的提问来源于stack exchange,提问作者geta_l
相关产品推荐
相关产品推荐

