2.3.2 单链表的插入删除、单链表的查找、单链表的建立
约 40 分钟
2.3.2 单链表操作:先保存链,再改链
带头结点时,在位序 插入要先找到第 个结点 p。正确顺序是:
Node *s = malloc(sizeof *s);
s->data = x;
s->next = p->next;
p->next = s;
若先执行 p->next=s 再令 s->next=p->next,s 会指向自己,原后继链丢失。删除 p 的后继则先保存目标:q=p->next; p->next=q->next; free(q);。
按位查找从头计步;按值查找逐结点比较,均为 。特殊技巧“已知非尾结点 p,却没有前驱”时,可把后继 q 的数据复制到 p,再删 q,达到 的外部效果。但这实际上删除的是后继结点,若 p 是尾结点就无法使用,若外部保存结点身份也要谨慎。
建表有两种方向。头插法每次把新结点放在头结点之后,读入 1,2,3 最终得到 3,2,1,会逆序;尾插法维护尾指针 r,执行 r->next=s; r=s;,保持输入次序。完成后尾结点 next 必须为 NULL。
陪做删除:H -> 10 -> 20 -> 30 删除位序 2。定位到第 1 个数据结点 10 作为 p,q 指向 20,再让 10 指向 30,最后释放 20。若先释放 q 再读取 q->next,就是释放后访问。
错解反馈:忘记检查 p 或 p->next 是否存在会在越界时崩溃;插入时两条赋值顺序颠倒会断链或自环;删除后不释放结点造成泄漏,释放后继续使用造成悬空访问。
迁移练习:写出在结点 p 后插入 x 的四行代码,并对 p 为尾结点测试。答案仍适用,此时 s->next=NULL。独立验收:能用箭头图逐句推演插入、删除、头插和尾插,并指出每个临时指针保护了哪段链。
小纸条
编程:写出在单链表结点p后插入新结点s的两条关键指针语句,并解释顺序。
登录 后可看答案
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。
本课练习正在补齐,暂不应标记为完成。