原文:https://blog.csdn.net/qq490691606/article/details/49948263node
Python 實現雙向鏈表(圖解)
雙向鏈表
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每一個數據結點中都有兩個指針,分別指向直接後繼和直接前驅。因此,從雙向鏈表中的任意一個結點開始,均可以很方便地訪問它的前驅結點和後繼結點。git
雙向鏈表基本方法實現(Python)
1. 初始化鏈表
定義節點結構:指針域pre、next和數據域data
爲方便操做添加了head和tail節點,初始化時head.next–>tail,tail.pre–>nextgithub
"""節點類"""
class Node(object):
def __init__(self, data=None):
self.data = data
self.pre = None
self.next = None數組
"""初始化雙向鏈表"""app
def __init__(self):
"""
設置頭尾,操做比較容易
頭--(next)--》尾
尾--(pre)--》頭
:return:
"""
head = Node()
tail = Node()
self.head = head
self.tail = tail
self.head.next = self.tail
self.tail.pre = self.head
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22.net
2. 獲取鏈表長度
起始head,每有一個節點,length+1指針
"""獲取鏈表長度"""blog
def __len__(self):
length = 0
node = self.head
while node.next != self.tail:
length += 1
node = node.next
return length
1
2
3
4
5
6
7
8
9
3. 追加節點
由於有tail 節點,因此找到tail.pre 節點就行了遞歸
"""追加節點"""索引
def append(self, data):
"""
:param data:
:return:
"""
node = Node(data)
pre = self.tail.pre
pre.next = node
node.pre = pre
self.tail.pre = node
node.next = self.tail
return node
1
2
3
4
5
6
7
8
9
10
11
12
13
14
4. 獲取節點
獲取節點要判斷index正負值
"""獲取節點"""
def get(self, index):
"""
獲取第index個值,若index>0正向獲取else 反向獲取
:param index:
:return:
"""
length = len(self)
index = index if index >= 0 else length + index
if index >= length or index < 0: return None
node = self.head.next
while index:
node = node.next
index -= 1
return node
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
5. 設置節點
找到當前節點賦值便可
"""設置節點"""
def set(self, index, data):
node = self.get(index)
if node:
node.data = data
return node
1
2
3
4
5
6
7
6. 插入節點
插入節點須要找到插入節點的前一個節點pre_node和後一個節點next_node(索引index的正負,前一節點不一樣,須要判斷一下),而後將pre_node.next–>node,node.pre->pre_node;next_node.pre–>node,node.next–>next_node
"""插入節點"""
def insert(self, index, data):
"""
由於加了頭尾節點因此獲取節點node就必定存在node.next 和 node.pre
:param index:
:param data:
:return:
"""
length = len(self)
if abs(index + 1) > length:
return False
index = index if index >= 0 else index + 1 + length
next_node = self.get(index)
if next_node:
node = Node(data)
pre_node = next_node.pre
pre_node.next = node
node.pre = pre_node
node.next = next_node
next_node.pre = node
return node
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
7. 刪除節點
刪除節點,也要區分一下索引的正負。找到當前節點的前一個節點pre_node和後一個節點next_node,將pre_node.nex–>next_node便可
"""刪除節點"""
def delete(self, index):
node = self.get(index)
if node:
node.pre.next = node.next
node.next.pre = node.pre
return True
return False
1
2
3
4
5
6
7
8
9
10
8. 反轉鏈表
反轉鏈表的實現有多種方式,比較簡單的就是生成一個新的鏈表--》能夠用數組存儲全部節點讓後倒序生成新的鏈表
在這裏用下面這種方式生產:
可能有點繞
1.node.next –> node.pre;node.pre –> node.next(遞歸)
2.head.next –> None;tail.pre –> None
3.head–>tail;tail–>head
"""反轉鏈表"""
def __reversed__(self):
"""
1.node.next --> node.pre
node.pre --> node.next
2.head.next --> None
tail.pre --> None
3.head-->tail
tail-->head
:return:
"""
pre_head = self.head
tail = self.tail
def reverse(pre_node, node):
if node:
next_node = node.next
node.next = pre_node
pre_node.pre = node
if pre_node is self.head:
pre_node.next = None
if node is self.tail:
node.pre = None
return reverse(node, next_node)
else:
self.head = tail
self.tail = pre_head
return reverse(self.head, self.head.next)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
9. 清空鏈表
相似初始化
"""清空鏈表"""def clear(self): self.head.next = self.tail self.tail.pre = self.head1234