2.3 单链表的定义、单链表的插入删除·综合题讲评
约 40 分钟
2.3 综合题:逆置、倒数结点与环检测
链表算法必须明确循环不变量。原地逆置单链表时,用 prev 保存已逆置前缀、cur 指向待处理首结点、next 防止剩余链丢失:
Node *reverse(Node *head) {
Node *prev=NULL, *cur=head;
while (cur) {
Node *next=cur->next;
cur->next=prev;
prev=cur; cur=next;
}
return prev;
}
每轮结束后,prev 是原前缀的逆序链,cur 仍指向未处理后缀。时间 、额外空间 。若是带头结点,应逆置 head->next,最后把新首结点接回头结点。
求倒数第 个结点可用双指针:快指针先走 步,再让快慢同时走;快到空时,慢指向倒数第 个。若不足 步就到空,说明不存在。该方法一次遍历 ,关键是先统一“走 步”对应的指针起点。
检测环用快慢指针。慢指针每次走 1 步,快指针走 2 步;若相遇则有环,若快指针到 NULL 则无环。相遇只能证明存在环,求入口还需把一个指针移回头部,然后二者每次各走一步,再次相遇处才是入口。
陪做逆置 1->2->3:第一轮 prev=1,cur=2,且 1 指向空;第二轮 prev=2,cur=3,2 指向 1;第三轮得到 3->2->1。没有临时 next,第一轮改向后就找不到 2。
错解反馈:逆置时先改链再保存后继会丢表;倒数题不检查 与链长不足会空指针;快指针循环条件只写 fast,却访问 fast->next->next,仍可能越界。
迁移练习:删除倒数第 个结点,可加哨兵结点并让快指针先走 步,使慢指针最终停在目标前驱。测试空表、单结点、删除首结点和 超长。独立验收:能陈述每个指针的职责、循环不变量、终止条件及边界用例。
小纸条
编程:逆置 1->2->3 时,第一轮循环后 prev、cur 与链分别是什么?
登录 后可看答案
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。
本课练习正在补齐,暂不应标记为完成。