双向链表: 包含两个指针,一个 prev 指向前一个节点,一个 next 指向后一个节点。
双向循环链表: 最后一个节点的 next 指向 head,而 head 的 prev 指向最后一个节点,构成一个环。
双向链表(Doubly Linked List)和双向循环链表(Doubly Circular Linked List)是两种不同类型的链表结构,它们的主要区别在于列表的首尾节点是否相连以及遍历终止条件的不同:
- 双向链表:
- 每个节点包含两个指针,一个指向前一个节点(称为前驱指针
prev
),另一个指向后一个节点(称为后继指针next
)。 - 链表的头部节点的前驱指针通常为
null
,表示没有更前的节点;尾部节点的后继指针也为null
,表示没有后续节点。
- 双向循环链表:
- 与双向链表类似,每个节点也包含两个指针分别指向前后节点。
- 在双向循环链表中,尾节点的后继指针不再是指向
null
,而是指向头节点;相应地,头节点的前驱指针指向尾节点。这样就形成了一个环状结构。
- 遍历区别:
- 双向链表在正常遍历时从头节点开始,通过不断移动到下一个节点直至遇到
next
指针为null
的节点结束。 - 双向循环链表的遍历可以在不设定终止条件的情况下持续进行,因为节点会形成一个闭环,可以从任意节点开始遍历,并且只有在特定条件下才会停止,例如在遍历过程中设置计数器或检查已访问过的节点来避免无限循环。
- 应用场景:
- 双向链表适用于需要在两端插入、删除元素,并且支持从前向后和从后向前遍历的场景。
- 双向循环链表常见于需要环形数据结构或者需要周期性访问相邻节点的应用,如某些算法中的队列实现(当队列满时新元素取代旧元素)等。