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,8 且 rear 指向 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
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。