双向链表

简介: 双向链表是一种链式存储结构,每个节点包含两个指针,分别指向其前驱和后继。相比于单向链表,双向链表可以在常数时间内向前或向后遍历整个链表。因此,双向链表在需要频繁遍历链表的场景中具有优势。

双向链表是一种链式存储结构,每个节点包含两个指针,分别指向其前驱和后继。相比于单向链表,双向链表可以在常数时间内向前或向后遍历整个链表。因此,双向链表在需要频繁遍历链表的场景中具有优势。
使用双向链表时,需要创建一个节点类,用于表示链表中的每个节点。节点类通常包含数据域和前驱指针、后继指针两个指针域。在实际应用中,可以根据需求定义其他属性和方法。
以下是一个简单的双向链表实现:

class Node:
def init(self, data):
self.data = data
self.prev = None
self.next = None
class DoublyLinkedList:
def init(self):
self.head = None
def append(self, data):
new_node = Node(data)
if not self.head:
self.head = new_node
return
last_node = self.head
while last_node.next:
last_node = last_node.next
last_node.next = new_node
new_node.prev = last_node
def print_list(self):
cur_node = self.head
while cur_node:
print(cur_node.data, end=" <-> ")
cur_node = cur_node.next
print("None")

使用示例

dll = DoublyLinkedList()
dll.append(1)
dll.append(2)
dll.append(3)
dll.print_list()
CopyCopy

什么时候使用双向链表:

  1. 需要常数时间遍历链表的场景。
  2. 需要频繁插入和删除节点的情景。
  3. 单向链表不能满足需求时,例如需要同时获取节点的前驱和后继。
    推荐 Demo:
  4. 实现双向链表的基本操作,如插入、删除、遍历等。
  5. 实现双向链表的排序算法,如插入排序、冒泡排序等。
  6. 使用双向链表实现栈、队列等数据结构。
  7. 使用双向链表实现图的遍历算法,如深度优先搜索、广度优先搜索等。
目录
相关文章
|
存储 算法 搜索推荐
双向链表
双向链表是一种链式存储结构,每个节点包含两个指针,分别指向其前驱和后继。相比于单向链表,双向链表可以在常数时间内向前或向后遍历整个链表。因此,双向链表在需要频繁遍历链表的场景中具有优势。
79 7
|
1月前
|
存储
双向链表
单链表每个结点有一个指针域和一个数据域,要访问任何结点都需知道头结点,不能逆着进行。双向链表则添加了一个指针域,通过两个指针域分别指向结点的前一个结点和后一个结点。这样的话,可以通过双链表的任何结点访问到它的前一个结点和后一个结点。 两个指针域一个存储直接后继结点的地址,一般称为右链域,另一个存储直接前驱结点,一般称为左链域。
|
2月前
|
存储
双向链表(详解)
双向链表(详解)
37 1
|
6月前
|
存储
双向链表专题
双向链表专题
51 6
|
6月前
双向链表的实现
双向链表的实现
24 0
|
6月前
|
存储 算法 前端开发
【C/数据结构与算法】:链表的实现(单向链表+双向链表)
【C/数据结构与算法】:链表的实现(单向链表+双向链表)
33 0
|
7月前
秒懂双向链表
秒懂双向链表
33 0
|
7月前
|
存储
双向链表介绍
带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这⾥“放哨的”。哨兵位存在的意义:避免链表出现死循环。
45 0
|
7月前
|
Java
7.双向链表最佳实现
7.双向链表最佳实现
63 1
10 双向链表
10 双向链表
44 0