数据结构与算法:1.链表结构
1 Python鏈表
1.1基本概念
概念:鏈表是通過一個個節點組成的,每個節點都包含了稱為cargo的基本單元,它也是一種**遞歸**的數據結構。
圖示:能保持數據之間的邏輯順序,但不必按照順序存儲。
和C不一樣的是python沒有專門的指針概念,在python中每個變量都是指針
鏈表的刪除可以通過修改指針來實現
Python實現鏈表的方法:
class Node:'''data:節點保存的數據_next:保存下一個節點對象'''def __init__(self,data,pnext=None):self.data=dataself._next=pnext1.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 = node31.3鏈表的常用方法
LinkedList() 創建空鏈表,不需要參數,返回值是空鏈表 is_empty() 測試鏈表是否為空,不需要參數,返回值是布爾值 append(data) 在尾部增加一個元素作為列表最后一個,參數是要追加的元素,無返回值 iter() 遍歷鏈表,無參數,無返回值,此方法一般是一個生成器 insert(idx,value) 插入一個元素,參數為插入元素的索引和值 remove(idx)移除1個元素,參數為要移除的元素或索引,并修改鏈表 size() 返回鏈表的元素數,不需要參數,返回值是個整數 search(item) 查找鏈表某元素,參數為要查找的元素或索引,返回是布爾值鏈表是一種常見的基礎數據結構,是一種線性表,但是并不會按線性的順序存儲數據,而是在每一個節點里存到下一個節點的指針(Pointer)。
1.4鏈表種類
單向鏈表、單向循環鏈表、雙向鏈表、雙向循環鏈表。
兩種最簡單的鏈表為單向鏈表和雙向鏈表。
單向鏈表通過一個外部的頭鏈接來訪問第1項,單向鏈表的節點被分成兩個部分,第一部分保存或顯示關于節點的信息,第二部分儲存下一節點地址。
單向鏈表只能向一個方向遍歷。單向鏈表中每個節點只有一個指針。
單向鏈表結構圖:
雙向鏈表結構圖:
- 鏈表無法進行隨機訪問,只能進行順序訪問。
- 鏈表分配內存的方式和數組不同,在鏈表中插入或刪除點時,可以直接進行插入或刪除,不需要在內存中移動數據項;
- 每一次插入和刪除的過程,鏈表會調整大小,不需要額外的內存代價,也不需要復制數據項。
1.5遍歷鏈表
鏈表的基本操作:遍歷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.链表结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NAT、防火墙的原理区别和分类
- 下一篇: NAT技术介绍