Python數(shù)據(jù)結(jié)構(gòu)之單鏈表
本文轉(zhuǎn)載自微信公眾號「python與大數(shù)據(jù)分析」,作者一只小小鳥鳥。轉(zhuǎn)載本文請聯(lián)系python與大數(shù)據(jù)分析公眾號。
今天終于把大學(xué)都沒想明白的鏈表數(shù)據(jù)結(jié)構(gòu)整明白了,也算小小的收獲,挺好玩的。文后附鏈表操作示意圖。
單向鏈表(單鏈表)是鏈表的一種,其特點是鏈表的鏈接方向是單向的,對鏈表的訪問要通過順序讀取從頭部開始。單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。
鏈表中的數(shù)據(jù)是以結(jié)點來表示的,每個結(jié)點的構(gòu)成:元素(數(shù)據(jù)元素的映象) + 指針(指示后繼元素存儲位置),元素就是存儲數(shù)據(jù)的存儲單元,指針就是連接每個結(jié)點的地址數(shù)據(jù)。它的每個節(jié)點包含兩個域,一個信息域(元素域)和一個鏈接域。這個鏈接指向鏈表中的下一個節(jié)點,而最后一個節(jié)點的鏈接域則指向一個空值。
- isempty(self) 鏈表是否為空
- length(self) 鏈表長度
- travel(self) 遍歷整個鏈表
- add(self,item) 鏈表頭部添加元素
- append(self,item) 鏈表尾部添加元素
- insert(self,item,index) 指定位置添加元素
- deletebyitem(self,item) 根據(jù)數(shù)據(jù)項刪除節(jié)點
- deletebyindex(self,index) 根據(jù)索引位置刪除節(jié)點
- search(self,item) 根據(jù)數(shù)據(jù)項查找節(jié)點是否存在
- update(self,index,item) 暫無實現(xiàn)
- getitem(self,index) 獲取索引位置對應(yīng)的數(shù)據(jù)項
- getindex(self,item) 獲取數(shù)據(jù)項對應(yīng)的索引位置
代碼基本為原創(chuàng),經(jīng)過大量重寫
- class Node(object):
- def __init__(self, item):
- self.item = item
- self.next = None
- def __repr__(self):
- pass
- def __str__(self):
- return str(self.item)
- class SingleLinkList(object):
- def __init__(self):
- self.header = None
- self.currentnum=0
- def isempty(self):
- return self.header == None
- def length(self):
- return self.currentnum
- def travel(self):
- cur =self.header
- while cur !=None:
- print("{}".format(cur.item),end=" ")
- cur=cur.next
- print("\r")
- def add(self,item):
- node=Node(item)
- # 新節(jié)點的鏈接指向頭節(jié)點
- node.next=self.header
- # 鏈表的頭指向新節(jié)點
- self.header=node
- self.currentnum+=1
- def append(self,item):
- tempnode=self.header
- node=Node(item)
- if self.isempty():
- self.add(node)
- else:
- while tempnode.next!=None:
- tempnode=tempnode.next
- tempnode.next=node
- self.currentnum+=1
- def insert(self,item,index):
- node=Node(item)
- tempnode=self.header
- if index>self.currentnum+1 or index<=0:
- raise IndexError("{} is not find in Linklist".format(index))
- # 指定位置為第一個即在頭部插入
- if index==1:
- self.add(node)
- elif index>self.currentnum-1:
- self.append(node)
- else:
- for i in range(1,index-1):
- tempnode=tempnode.next
- node.next=tempnode.next
- tempnode.next=node
- self.currentnum+=1
- def deletebyitem(self,item):
- tempnode=self.header
- prenode=None
- while tempnode!=None:
- if tempnode.item==item:
- if tempnode==self.header:
- self.header=tempnode.next
- else:
- prenode.next=tempnode.next
- break
- else:
- prenode=tempnode
- tempnode=tempnode.next
- def deletebyindex(self,index):
- if index>self.currentnum or index<=0:
- raise IndexError("{} is not find in Linklist".format(index))
- i=1
- tempnode=self.header
- prenode=self.header
- if index==1:
- self.header = tempnode.next
- self.currentnum-=1
- return
- while tempnode.next and i<index:
- prenode = tempnode
- tempnode = tempnode.next
- i+=1
- if i==index:
- prenode.next=tempnode.next
- self.currentnum-=1
- def search(self,item):
- tempnode=self.header
- while tempnode!=None:
- if tempnode.item==item:
- return True
- else:
- tempnode=tempnode.next
- return False
- def update(self,index,item):
- pass
- def getitem(self,index):
- if index<=0 or index>self.currentnum:
- raise IndexError("{} is not find in Linklist".format(index))
- tempnode=self.header
- i=1
- while i<index:
- tempnode=tempnode.next
- i+=1
- return tempnode.item
- def getindex(self,item):
- tempnode = self.header
- i=0
- flag=False
- while tempnode != None:
- i+=1
- if tempnode.item == item:
- flag=True
- return i
- else:
- tempnode = tempnode.next
- if flag==False:
- return 0
- if __name__ == '__main__':
- a = SingleLinkList()
- a.add(1) # 1
- print('a.add(1)')
- a.travel()
- a.add(2) # 2 1
- print('a.add(2)')
- a.travel()
- a.append(3) # 2 1 3
- print('a.append(3)')
- a.travel()
- a.insert(4, 2) # 2 1 4 3
- print('a.insert(2, 4)')
- a.travel()
- print('a.search(1)=',a.search(1))
- print('a.search(5)=', a.search(5))
- print('a.getindex(1)=',a.getindex(1))
- print('a.getindex(5)=', a.getindex(5))
- print('a.getitem(2)=', a.getitem(2))
- print('a.getitem(4)=', a.getitem(4))
- print('a.getitem(3)=', a.getitem(3))
- # a.deletebyitem(5)
- # print('a.deletebyitem(5)')
- # a.travel()
- # a.deletebyitem(4)
- # print('a.deletebyitem(4)')
- # a.travel()
- # a.deletebyitem(2)
- # print('a.deletebyitem(2)')
- # a.travel()
- a.deletebyindex(4)
- print('a.deletebyindex(4)')
- a.travel()
- a.deletebyindex(2)
- print('a.deletebyindex(2)')
- a.travel()
- a.deletebyindex(1)
- print('a.deletebyindex(1)')
- a.travel()
結(jié)果如下
- C:\python\pyproject\pythonalgorithms\venv\Scripts\python.exe C:/python/pyproject/pythonalgorithms/linklist.py
- a.add(1)
- 1
- a.add(2)
- 2 1
- a.append(3)
- 2 1 3
- a.insert(2, 4)
- 2 4 1 3
- a.search(1)= True
- a.search(5)= False
- a.getindex(1)= 3
- a.getindex(5)= 0
- a.getitem(2)= 4
- a.getitem(4)= 3
- a.getitem(3)= 1
- a.deletebyindex(4)
- 2 4 1
- a.deletebyindex(2)
- 2 1
- a.deletebyindex(1)
- 1
- Process finished with exit code 0
鏈表頭部增加節(jié)點示意圖
從鏈表尾部增加節(jié)點示意圖