python双向索引什么意思_(转)Python 实现双向链表(图解)
原文:https://blog.csdn.net/qq490691606/article/details/49948263
Python 實現(xiàn)雙向鏈表(圖解)
雙向鏈表
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結點中都有兩個指針,分別指向直接后繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。
雙向鏈表基本方法實現(xiàn)(Python)
1. 初始化鏈表
定義節(jié)點結構:指針域pre、next和數(shù)據(jù)域data
為方便操作添加了head和tail節(jié)點,初始化時head.next–>tail,tail.pre–>next
"""節(jié)點類"""
class Node(object):
def __init__(self, data=None):
self.data = data
self.pre = None
self.next = None
"""初始化雙向鏈表"""
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
2. 獲取鏈表長度
起始head,每有一個節(jié)點,length+1
"""獲取鏈表長度"""
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. 追加節(jié)點
因為有tail 節(jié)點,所以找到tail.pre 節(jié)點就好了
"""追加節(jié)點"""
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. 獲取節(jié)點
獲取節(jié)點要判斷index正負值
"""獲取節(jié)點"""
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. 設置節(jié)點
找到當前節(jié)點賦值即可
"""設置節(jié)點"""
def set(self, index, data):
node = self.get(index)
if node:
node.data = data
return node
1
2
3
4
5
6
7
6. 插入節(jié)點
插入節(jié)點需要找到插入節(jié)點的前一個節(jié)點pre_node和后一個節(jié)點next_node(索引index的正負,前一節(jié)點不同,需要判斷一下),然后將pre_node.next–>node,node.pre->pre_node;next_node.pre–>node,node.next–>next_node
"""插入節(jié)點"""
def insert(self, index, data):
"""
因為加了頭尾節(jié)點所以獲取節(jié)點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. 刪除節(jié)點
刪除節(jié)點,也要區(qū)分一下索引的正負。找到當前節(jié)點的前一個節(jié)點pre_node和后一個節(jié)點next_node,將pre_node.nex–>next_node即可
"""刪除節(jié)點"""
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. 反轉鏈表
反轉鏈表的實現(xiàn)有多種方式,比較簡單的就是生成一個新的鏈表--》可以用數(shù)組存儲所有節(jié)點讓后倒序生成新的鏈表
在這里用下面這種方式生產(chǎn):
可能有點繞
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.head
1
2
3
4
git 路徑 https://github.com/wangpanjun/datastructure.git
---------------------
作者:過分了
來源:CSDN
原文:https://blog.csdn.net/qq490691606/article/details/49948263
版權聲明:本文為博主原創(chuàng)文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的python双向索引什么意思_(转)Python 实现双向链表(图解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人生苦短我学python表情包_Pyth
- 下一篇: tcp 发送数据长度比预设缓存大_一文秒