本文實例講述了Python單向鏈表和雙向鏈表原理與用法。分享給大家供大家參考,具體如下:
鏈表是一種數據結構,鏈表在循環遍歷的時候效率不高,但是在插入和刪除時優勢比較大。
鏈表由一個個節點組成。
單向鏈表的節點分為兩個部分:存儲的對象和對下一個節點的引用。注意是指向下一個節點。
而雙向鏈表區別于單向鏈表的是它是由三個部分組成:存儲的對象、對下一個節點的引用、對上一個節點的引用,可以實現雙向遍歷。
單向列表的結構如下圖:
head是頭節點,tail是尾節點,每個節點由Data存儲對象和Next對下一個節點引用組成
下面說一下單向鏈表插入和刪除的過程。
插入一個新節點:
原理:前一個節點的Next指向當前新節點,新節點的Next指向要插入節點位置的后一個節點。
注意:在實際應用時需要考慮插入位置是頭結點和尾節點的情況。
刪除一個節點:
原理:找到要刪除節點的上一個節點,直接上一個節點的Next指向刪除位置的下一個節點。
注意:在實際應用中需要考慮到刪除的節點是否是頭節點或尾節點,需要考慮到鏈表的長度。
下面附上一個用python寫的單鏈表的例子。
class Node: next = None data = None def __init__(self,nodeData): self.data = nodeDataclass List: head = None size = 0 def __init__(self): self.size = 0 self.head = None #遍歷鏈表 def a(self): print("avx") def printlist(self): p=self.head while(p is not None): print(p.data) p=p.next print("——————————————————————————————————————") def insertlink(self, a, newdata): newnode = Node(newdata) if self.size == 0: print("The link is none") self.head = newnode self.size = self.size+1 else: p = self.head while(p is not None )and (p.data != a): p = p.next if p.next is None: p.next = newnode self.size = self.size + 1 else: newnode.next = p.next p.next = newnode self.size = self.size + 1 #刪除鏈表中的節點 def deldata(self,a): if self.size == 0: print("The link is none") elif self.size ==1: self.head = None self.size = self.size -1 else: p = self.head while(p is not None )and (p.data != a): q = p p = p.next if p is None: print("Can't find a") elif p == self.head: self.head = p.next elif p.data ==a and p.next is not None: q.next = q.next.next self.size = self.size - 1 else: q.next = None self.size = self.size - 1 #修改鏈表中的指定節點 def updatelink(self,a,b): p = self.head print(p.data) while(p is not None ) and (p.data!=a): p = p.next if p is None: print("Can't find a") else: p.data = bif __name__=="__main__": p = List() p.insertlink(1,1) p.insertlink(1,2) p.insertlink(1,3) p.insertlink(1,4) print("_________________________---insertlink") p.printlist() print("_________________________--chalink") p.updatelink(2,5) p.printlist() print("___________________________-----dellink") p.deldata(5) p.printlist()
新聞熱點
疑難解答