日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python双向索引什么意思_(转)Python 实现双向链表(图解)

發(fā)布時間:2024/9/15 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python双向索引什么意思_(转)Python 实现双向链表(图解) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文:https://blog.csdn.net/qq490691606/article/details/49948263

Python 實(shí)現(xiàn)雙向鏈表(圖解)

雙向鏈表

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結(jié)點(diǎn)中都有兩個指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個結(jié)點(diǎn)開始,都可以很方便地訪問它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。

雙向鏈表基本方法實(shí)現(xiàn)(Python)

1. 初始化鏈表

定義節(jié)點(diǎn)結(jié)構(gòu):指針域pre、next和數(shù)據(jù)域data

為方便操作添加了head和tail節(jié)點(diǎn),初始化時head.next–>tail,tail.pre–>next

"""節(jié)點(diǎn)類"""

class Node(object):

def __init__(self, data=None):

self.data = data

self.pre = None

self.next = None

"""初始化雙向鏈表"""

def __init__(self):

"""

設(shè)置頭尾,操作比較容易

頭--(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é)點(diǎn),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é)點(diǎn)

因?yàn)橛衪ail 節(jié)點(diǎn),所以找到tail.pre 節(jié)點(diǎn)就好了

"""追加節(jié)點(diǎn)"""

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é)點(diǎn)

獲取節(jié)點(diǎn)要判斷index正負(fù)值

"""獲取節(jié)點(diǎn)"""

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. 設(shè)置節(jié)點(diǎn)

找到當(dāng)前節(jié)點(diǎn)賦值即可

"""設(shè)置節(jié)點(diǎn)"""

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é)點(diǎn)

插入節(jié)點(diǎn)需要找到插入節(jié)點(diǎn)的前一個節(jié)點(diǎn)pre_node和后一個節(jié)點(diǎn)next_node(索引index的正負(fù),前一節(jié)點(diǎn)不同,需要判斷一下),然后將pre_node.next–>node,node.pre->pre_node;next_node.pre–>node,node.next–>next_node

"""插入節(jié)點(diǎn)"""

def insert(self, index, data):

"""

因?yàn)榧恿祟^尾節(jié)點(diǎn)所以獲取節(jié)點(diǎn)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é)點(diǎn)

刪除節(jié)點(diǎn),也要區(qū)分一下索引的正負(fù)。找到當(dāng)前節(jié)點(diǎn)的前一個節(jié)點(diǎn)pre_node和后一個節(jié)點(diǎn)next_node,將pre_node.nex–>next_node即可

"""刪除節(jié)點(diǎn)"""

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. 反轉(zhuǎn)鏈表

反轉(zhuǎn)鏈表的實(shí)現(xiàn)有多種方式,比較簡單的就是生成一個新的鏈表--》可以用數(shù)組存儲所有節(jié)點(diǎn)讓后倒序生成新的鏈表

在這里用下面這種方式生產(chǎn):

可能有點(diǎn)繞

1.node.next –> node.pre;node.pre –> node.next(遞歸)

2.head.next –> None;tail.pre –> None

3.head–>tail;tail–>head

"""反轉(zhuǎn)鏈表"""

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

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

總結(jié)

以上是生活随笔為你收集整理的python双向索引什么意思_(转)Python 实现双向链表(图解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。