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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法:1.链表结构

發布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法:1.链表结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 Python鏈表

1.1基本概念

概念:鏈表是通過一個個節點組成的,每個節點都包含了稱為cargo的基本單元,它也是一種**遞歸**的數據結構。

圖示:能保持數據之間的邏輯順序,但不必按照順序存儲。

和C不一樣的是python沒有專門的指針概念,在python中每個變量都是指針

鏈表的刪除可以通過修改指針來實現

Python實現鏈表的方法:

class Node:'''data:節點保存的數據_next:保存下一個節點對象'''def __init__(self,data,pnext=None):self.data=dataself._next=pnext

1.2 鏈表的基本要素

1.節點,每一個節點有兩個域:

左:值域,右:針域

2.head節點:特殊節點,永遠指向第一個節點

3.tail節點:特殊節點,永遠指向最后一個節點

4.None:鏈表最后節點的針域的指針指向None值,因此也叫接地點.

class Node:def __init__(self,data = None, next = None):self.data = dataself.next = next

創建獨立節點:

node1 = Node(1) node2 = Node(2) node3 = Node(3)

表示節點間關系:

node1.next = node2 node2.next = node3

1.3鏈表的常用方法

LinkedList() 創建空鏈表,不需要參數,返回值是空鏈表 is_empty() 測試鏈表是否為空,不需要參數,返回值是布爾值 append(data) 在尾部增加一個元素作為列表最后一個,參數是要追加的元素,無返回值 iter() 遍歷鏈表,無參數,無返回值,此方法一般是一個生成器 insert(idx,value) 插入一個元素,參數為插入元素的索引和值 remove(idx)移除1個元素,參數為要移除的元素或索引,并修改鏈表 size() 返回鏈表的元素數,不需要參數,返回值是個整數 search(item) 查找鏈表某元素,參數為要查找的元素或索引,返回是布爾值

鏈表是一種常見的基礎數據結構,是一種線性表,但是并不會按線性的順序存儲數據,而是在每一個節點里存到下一個節點的指針(Pointer)。

1.4鏈表種類

單向鏈表、單向循環鏈表、雙向鏈表、雙向循環鏈表。

兩種最簡單的鏈表為單向鏈表和雙向鏈表。

單向鏈表通過一個外部的頭鏈接來訪問第1項,單向鏈表的節點被分成兩個部分,第一部分保存或顯示關于節點的信息,第二部分儲存下一節點地址。

單向鏈表只能向一個方向遍歷。單向鏈表中每個節點只有一個指針。

單向鏈表結構圖:

雙向鏈表結構圖:

  • 鏈表無法進行隨機訪問,只能進行順序訪問。
  • 鏈表分配內存的方式和數組不同,在鏈表中插入或刪除點時,可以直接進行插入或刪除,不需要在內存中移動數據項;
  • 每一次插入和刪除的過程,鏈表會調整大小,不需要額外的內存代價,也不需要復制數據項。

1.5遍歷鏈表

鏈表的基本操作:遍歷next節點

  • 在列表中查找一個元素
  • 在列表中插入一個元素
  • 從列表中刪除一列元素
probe = head while probe != None:probe = probe.next
  • 注意:

    ? 不可以用head來遍歷列表,否則會丟失列表的一些節點,可以使用和head相同類型的臨時的指針變量,這個變量先初始化為鏈表結構的head指針,然后控制一個循環。

單向鏈表遍歷為例,流程框圖如下:

遍歷結束后,temp指針為None,而head指針還是指向第一個節點,遍歷在時間上是線性的,并且不需要額外的內存。

遍歷單鏈表結構會訪問每一個節點,并且當遇到一個空鏈接的時候終止,而None就是充當負責停止這個過程的哨兵。

1.6鏈表運用

class LinkedList:def __init__(self):self.head = Noneself.tail = Nonedef is_empty(self):return self.head is Nonedef append(self,data):node = Node(data)if self.head is None:self.head = nodeself.tail = nodeelse:self.tail.next = nodeself.tail = nodedef iter(self):if not self.head:returncur = self.headyield cur.datawhile cur.next:cur =cur.nextyield cur.datadef insert(self, idx, value):cur = self.headcur_idx = 0if cur is None:raise Exception("The list is an empty")while cur_idx < idx - 1:cur = cur.nextif cur is None:raise Exception('......')cur_idx = cur_idx + 1node = Node(value)node.next = cur.nextcur.next = nodeif node.next is None:self.tail = nodedef remove(self, idx):cur = self.headcur_idx = 0if self.head is None: # 空鏈表時raise Exception('The list is an empty list')while cur_idx < idx-1:cur = cur.nextif cur is None:raise Exception('list length less than index')cur_idx += 1if idx == 0: # 當刪除第一個節點時self.head = cur.nextcur = cur.nextreturnif self.head is self.tail: # 當只有一個節點的鏈表時self.head = Noneself.tail = Nonereturncur.next = cur.next.nextif cur.next is None: # 當刪除的節點是鏈表最后一個節點時self.tail = curdef size(self):current = self.headcount = 0if current is None:return 'The list is an empty list'while current is not None:count += 1current = current.nextreturn countdef search(self, item):current = self.headfound = Falsewhile current is not None and not found:if current.data == item:found = Trueelse:current = current.nextreturn found

驗證操作:

if __name__ == '__main__':link_list = LinkedList()for i in range(150):link_list.append(i)print(link_list.is_empty())link_list.insert(10, 30)

總結

以上是生活随笔為你收集整理的数据结构与算法:1.链表结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。