跳到正文

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

本课练习

0

先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。

本课练习正在补齐,暂不应标记为完成。