双向循环链表和双向链表一样,双向循环链表上的每个节点都有前后两个指针,分别指向前节点和后节点。但与双向链表不同的是:它的尾节点和链表的头节点是连着的。即尾节点的后(next)指针指向头节点,头节点的前(pre)指针指向尾节点。此类双向循环链表形成一个头尾相连的环状。与单向循环链表的区别在于:它可以正向遍历,也可以反向遍历,双向循环链表如下图所示。
例题1:双向循环链表的追加和遍历。
双向循环链表的追加与双向链表大致相同。所不同的是:每次插入或删除必须顾及是否破坏头尾相连的循环结构。双向循环链表的每次追加必须涉及与头节点的重新连接。追加节点的算法逻辑必须考虑两个因素:①双向循环链表在插入第一个元素时,需要将第一个元素的前向和后向指针均指向其自身。②实现双向循环链表的插入、删除在中间部位与双向链表相同,其关键是考虑头尾节点(或只有一个节点的情况)问题,因为头尾节点带有头尾指针,插人(或删除)后会导致指针指向转移,双向循环链表追加节点算法图解如下图所示。
每一个追加节点需要设置的指针包括:前尾节点的后向指针指向新节点,新节点的前向针指向链表的尾节点,新节点的后向指针指向头节点,头节点的后向指针指向新节点,还有尾指针指向到新节点。整在各种链表中算是最为烦琐的。
程序代码:
运行结果:
练习1:在双向循环链表中输入下面的数列,然后正反2个方向打印出来。[1, 55, 98, 3, 4, 8, 23, 71]。
练习2:如果把只要一个方向循环的链表称作双向单循环链表,编程实现它的追加与删除。
例题2:双向循环链表的随机插人和随机删除。
双向循环链表在随机插入和随机删除上相似于双向链表,所不同的在于头尾节点,因为多了一对指针的相互指向,所以要多加两次引用赋值,烦琐度更高些。
程序代码:
运行结果:
练习3:编程实现双向单循环链表的随机插入和删除操作。
学思营编程课堂基于蓝桥STEM86平台https://www.stem86.com,开展学编程三部曲:Scratch(三年级以前)>>>Python(四年级以后)>>>C++(七年级以后)教育实验活动,任何人可以免费参加,打开https://xuesiying.stem86.com网页注册进入课堂,也可关注本公众号留言。更多课程请打开“学思营”同步网站:http://www.5xstar.com/doc.html
参考资料:
1、《Python算法图解》何韬编著 清华大学出版社