日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Python 新手刚学链表,做了一个“捣浆糊”版的单链表类

發(fā)布時間:2023/12/18 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 新手刚学链表,做了一个“捣浆糊”版的单链表类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

鏈表定義

鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。

單向鏈表,又叫單鏈表、單向表,是由一個個節(jié)點組成的,每個節(jié)點是一種信息集合,包含元素本身以及下一個節(jié)點的地址。節(jié)點在內(nèi)存中是非連續(xù)分布的,在程序運行期間,根據(jù)需要可以動態(tài)的創(chuàng)建節(jié)點,這就使得鏈表的長度沒有邏輯上的限制,有限制的是堆的大小。

在單向鏈表中,每個節(jié)點中存儲著下一個節(jié)點的地址?;趩蜗蜴湵?#xff0c;在每個節(jié)點內(nèi)增加一個前驅(qū)節(jié)點的地址,這就是所謂的雙向鏈表,又叫雙鏈表、雙向表。

如單向鏈表的尾節(jié)點指針指向頭節(jié)點,即為循環(huán)單向鏈表。
如單向鏈表的頭、尾節(jié)點指針互相指,即為循環(huán)雙向鏈表。

指針是C/C++等語言中的概念,也就是內(nèi)存地址;python中沒有指針,也很少直接操作地址。
在?python 這一類沒有指針的語言里,很難真正體現(xiàn)出鏈表的精髓,只能模擬出一個靜態(tài)鏈表來意思意思。

單向表類的實現(xiàn)

模仿python中二叉樹的節(jié)點Node類,把左右子樹的left,right換成一個Next,就有點像了。因為剛學(xué)python不久功力有限,愣是用字符串和列表,偽實現(xiàn)了一個單向表的類:

class Node():def __init__(self,val=None,Next=None):self.val = valself.Next = Nextdef __repr__(self):return 'listNode('+str(self.val)+')'def __getitem__(self, slices):list = self.values()return list[slices]def is_empty(self):return self.val is Nonedef value(self):return self.valdef values(self):head = selft = 'head'r = []while eval(t) is not None:r.append(eval(t).val)t+='.Next'return rdef size(self):if self.is_empty():return 0r = self.values()return len(r)def append(self, node):if self.val is None:self.val = nodereturnhead = selft = 'head'while eval(t) is not None:t+='.Next'exec(f'{t}=Node({node})')def pop(self):head = selfif head.size() < 2:res = head.valhead.val = Nonereturn rest = 'head'while eval(t).Next is not None:t+='.Next'res = eval(t).valexec(f'{t}=None')return resdef pprint(self):r = self.values()r = [i.join(["'"]*2) if type(i) is str else str(i) for i in r]print('->'.join(r))

之所以說是“偽實現(xiàn)”,因為根本就是用字符串和列表模擬出來的效果。盡管這個類如此不入門,有點傻傻的,用上海咸話的講法,稱之為“搗漿糊”。但還是能完成不少功能的。呈上測試代碼,如下:

1. 逐個賦值

>>> LinkedList = Node() >>> LinkedList.is_empty() True >>> LinkedList.size() 0 >>> LinkedList = Node(1) >>> LinkedList.is_empty() False >>> LinkedList.size() 1 >>> LL = LinkedList >>> LL.Next = Node(2) >>> LL listNode(1) >>> LL.Next listNode(2) >>> LL.val 1 >>> LL.Next.val 2 >>> LL.value() 1 >>> LL.Next.value() 2 >>> LL.values() [1, 2] >>> >>> >>> LinkedList = Node() >>> LinkedList = Node(1,Node(2)) >>> linked = Node(1,Node(2)) >>> linked.Next.Next = Node('3',Node(4)) >>> linked.pprint() 1->2->'3'->4 >>> linked.values() [1, 2, '3', 4] >>>

注:此鏈表類允許數(shù)字、字符串混裝?

2.追加append()和彈出pop()

>>> single = Node(1,Node(2,Node(3,Node(4,Node(5))))) >>> single.pprint() 1->2->3->4->5 >>> single.append(6) >>> single.pprint() 1->2->3->4->5->6 >>> single.pop() 6 >>> single.pop() 5 >>> single.pprint() 1->2->3->4 >>>

?3. 嵌套賦值或用循環(huán)賦值

>>> single = Node(1,Node(2,Node(3,Node(4,Node(5))))) >>> single.size() 5 >>> single.values() [1, 2, 3, 4, 5] >>> >>> >>> link = Node() >>> for i in range(1,9):link.append(i)>>> link.pprint() 1->2->3->4->5->6->7->8 >>>

4. 索引和切片

>>> lList = Node() >>> t = [lList.append(i) for i in range(1,9)] >>> lList.pprint() 1->2->3->4->5->6->7->8 >>> lList[:] [1, 2, 3, 4, 5, 6, 7, 8] >>> lList[::-1] [8, 7, 6, 5, 4, 3, 2, 1] >>> lList[0] 1 >>> lList[1] 2 >>> lList[7] 8 >>> lList[-1] 8 >>> lList[-2] 7 >>> lList[-8] 1 >>> lList[:5] [1, 2, 3, 4, 5] >>> lList[5:] [6, 7, 8] >>> lList[::2] [1, 3, 5, 7] >>> lList[1::2] [2, 4, 6, 8] >>>

注:鏈表一般是不帶索引功能的,這里用類的內(nèi)置方法__getitem__(self, slices)來強加一個索引和切片的功能,完全是繼承了列表的功能。

5. 刪除和插入

>>> single = Node(1,Node(2,Node(3,Node(4,Node(5))))) >>> single.pprint() 1->2->3->4->5 >>> single.Next.Next = single.Next.Next.Next >>> single.pprint() 1->2->4->5 >>> >>> tmp = single.Next.Next >>> single.Next.Next = Node(6) >>> single.Next.Next.Next = tmp >>> single.pprint() 1->2->6->4->5 >>>

注:刪除和插入方法沒有直接寫進這個類里,但也能用代碼實現(xiàn)類似操作。

單鏈表真實的刪除和插入操作過程,如下所示:

6. 單鏈表的反轉(zhuǎn)(倒序)

>>> linked = Node() >>> assign = [linked.append(i) for i in range(1,9)] >>> linked.pprint() 1->2->3->4->5->6->7->8 >>> tmp,linked = linked,Node() >>> while not tmp.is_empty():linked.append(tmp.pop())>>> linked.pprint() 8->7->6->5->4->3->2->1 >>>

注:用循環(huán)反復(fù)追加append原鏈表的pop()返回值完成倒序操作。
?

“搗漿糊”版的鏈表類就到此結(jié)束吧,準備下一篇再來重寫一個進階一點的鏈表類? ?^_^

總結(jié)

以上是生活随笔為你收集整理的Python 新手刚学链表,做了一个“捣浆糊”版的单链表类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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