跳到正文

2.3.4 循环链表

40 分钟

2.3.4 循环链表:终止条件从空指针改为回到起点

循环单链表把尾结点的 next 指回头结点(带头结点)或首数据结点(不带头结点),因此链上通常没有 NULL。它适合轮转调度、循环队列等需要从末尾自然回到开头的场景。

带头结点时空表可令 head->next=head。遍历写成:

for (Node *p=head->next; p!=head; p=p->next) visit(p->data);

若仍以 p!=NULL 作为终止条件,会无限循环。判断结点 p 是否为尾结点可用 p->next==head

只保存尾指针 rear 常比只保存头指针方便。首结点是 rear->next,在首部或尾部插入都可用常数次改链;若只保存首指针,寻找尾部仍需 。两个循环链表合并时,若各自有尾指针,可以交换两条首尾连接在 内完成。

循环双链表通常让头结点满足 head->next 指首结点、head->prev 指尾结点;空表时两者都指向 head。这样首尾插删使用统一的四指针操作。

陪做:循环单链表含 2,5,8rear 指向 8。首元素是 rear->next 即 2。尾插 10 时,先令新结点指向 2,再令 8 指向新结点,最后更新 rear 为新结点。

错解反馈:用 NULL 判断结束会死循环;循环链表并不意味着逻辑结构变成环形关系,它仍可作为线性表实现,只是存储链接形成回路;合并后忘记更新尾指针,会让后续尾插接错位置。

迁移练习:从任意结点 p 出发恰好访问一圈,应使用 do...while(q!=p)。解释为什么普通 while(q!=p) 会一次也不执行。独立验收:能写出空表、单结点表的指针关系,并证明遍历会终止。

小纸条

单选:带头结点循环单链表从首元素遍历,正确终止条件通常是?A p==NULL B p==head C p->next==NULL D p->data==0

登录 后可看答案

Practice

本课练习

0

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

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