python 鏈表實現 雙向鏈表
阿新 • • 發佈:2018-04-15
hid single -a http AI 指定位置 AR 一個 bre
1. 雙向鏈表的定義
每個節點有兩個鏈接:一個指向前一個節點,當此節點為第一個節點時,指向空值;而另一個指向下一個節點,當此節點為最後一個節點時,指向空值。
2. 操作
- is_empty() 鏈表是否為空
- length() 鏈表長度
- travel() 遍歷鏈表
- add(item) 鏈表頭部添加
- append(item) 鏈表尾部添加
- insert(pos, item) 指定位置添加
- remove(item) 刪除節點
- search(item) 查找節點是否存在
3. 實現
class Node(object): def __init__(self,item): self.elem= item self.next = None self.prev = None class DoubleLinkList(object): ‘‘‘ 雙鏈表 ‘‘‘ def __init__(self,node=None): self.__head = node def is_empty(self): #判斷鏈表是否為空 return self.__head is None def length(self):#鏈表的長度 #cur遊標,用來遍歷節點,count記錄數量 cur = self.__head count = 0 while cur != None: count += 1 cur = cur.next return count def travel(self): #遍歷鏈表 cur = self.__head while cur != None: print(cur.elem,end=‘‘) cur = cur.next print(‘‘) def add(self,item): #在鏈表頭部添加節點 node = Node(item) node.next = self.__head self.__head = node node.next.prev = node def append(self,item): #在鏈表尾部添加節點 node = Node(item) if self.is_empty(): self.__head = node else: cur = self.__head while cur.next != None: cur = cur.next cur.next = node node.prev = cur
在鏈表指定位置插入元素
def insert(self,pos,item): #在鏈表指定位置添加節點 # pos從0開始 if pos <= 0: self.add(item) elif pos > (self.length()-1): self.append(item) else: cur = self.__head count = 0 while count < pos: count += 1 cur = cur.next #當退出循環後,pre指向pos位置 node = Node(item) # node.next = cur # node.prev = cur.prev # cur.prev.next = node # cur.prev = node node.prev = cur #將node的prev指向cur node.next = cur.next #將node的next指向cur的下一個節點 cur.next.prev = node #將cur的下一個節點的prev指向node cur.next = node #將cur的next指向node
移除和查找節點
def remove(self,item): #移除節點 cur = self.__head while cur != None: if cur.elem == item: #先判斷此節點是否是頭節點 #頭節點 if cur == self.__head: self.__head = cur.next if cur.next: #判斷鏈表是否只有一個節點 cur.next.prev = None else: cur.prev.next = cur.next if cur.next: cur.next.prev = cur.prev break else: cur = cur.next def search(self,item): #查找節點 cur = self.__head while cur != None: if cur.elem == item: return True else: cur = cur.next return False
完整代碼:
class Node(object): def __init__(self,item): self.elem = item self.next = None self.prev = None class DoubleLinkList(object): ‘‘‘ 雙鏈表 ‘‘‘ def __init__(self,node=None): self.__head = node def is_empty(self): #判斷鏈表是否為空 return self.__head is None def length(self): #鏈表的長度 #cur遊標,用來遍歷節點,count記錄數量 cur = self.__head count = 0 while cur != None: count += 1 cur = cur.next return count def travel(self): #遍歷鏈表 cur = self.__head while cur != None: print(cur.elem,end=‘ ‘) cur = cur.next print(‘‘) def add(self,item): #在鏈表頭部添加節點 node = Node(item) node.next = self.__head self.__head = node node.next.prev = node def append(self,item): #在鏈表尾部添加節點 node = Node(item) if self.is_empty(): self.__head = node else: cur = self.__head while cur.next != None: cur = cur.next cur.next = node node.prev = cur def insert(self,pos,item): #在鏈表指定位置添加節點 # pos從0開始 if pos <= 0: self.add(item) elif pos > (self.length()-1): self.append(item) else: cur = self.__head count = 0 while count < pos: count += 1 cur = cur.next #當退出循環後,pre指向pos位置 node = Node(item) # node.next = cur # node.prev = cur.prev # cur.prev.next = node # cur.prev = node node.prev = cur #將node的prev指向cur node.next = cur.next #將node的next指向cur的下一個節點 cur.next.prev = node #將cur的下一個節點的prev指向node cur.next = node #將cur的next指向node def remove(self,item): #移除節點 cur = self.__head while cur != None: if cur.elem == item: #先判斷此節點是否是頭節點 #頭節點 if cur == self.__head: self.__head = cur.next if cur.next: #判斷鏈表是否只有一個節點 cur.next.prev = None else: cur.prev.next = cur.next if cur.next: cur.next.prev = cur.prev break else: cur = cur.next def search(self,item): #查找節點 cur = self.__head while cur != None: if cur.elem == item: return True else: cur = cur.next return False if __name__ == ‘__main__‘: dll = DoubleLinkList() print(dll.is_empty()) print(dll.length()) dll.append(1) print(dll.is_empty()) print(dll.length()) dll.append(2) dll.add(8) dll.append(3) dll.append(4) dll.append(5) dll.append(6) dll.insert(-1,9) dll.travel() dll.insert(3,100) dll.travel() dll.insert(10,200) dll.travel() dll.remove(100) dll.travel() dll.remove(9) dll.travel() dll.remove(200) dll.travel() ‘‘‘ 運行結果 True 0 False 1 9 8 1 2 3 4 5 6 9 8 1 2 100 3 4 5 6 9 8 1 2 100 3 4 5 6 200 9 8 1 2 3 4 5 6 200 8 1 2 3 4 5 6 200 8 1 2 3 4 5 6 ‘‘‘View Code
單向循環鏈表
1. 單鏈表的一個變形是單向循環鏈表,鏈表中最後一個節點的next域不再為None,而是指向鏈表的頭節點。
2. 操作
- is_empty() 判斷鏈表是否為空
- length() 返回鏈表的長度
- travel() 遍歷
- add(item) 在頭部添加一個節點
- append(item) 在尾部添加一個節點
- insert(pos, item) 在指定位置pos添加節點
- remove(item) 刪除一個節點
- search(item) 查找節點是否存在
3. 實現
class Node(object): #單向循環鏈表節點類實現 def __init__(self,elem): self.elem = elem self.next = None class SingleCycleLinkList(object): #單向循環鏈表類實現 def __init__(self,node=None): self.__head = node if node: node.next = node def is_empty(self): #判斷鏈表是否為空 return self.__head == None def length(self): #鏈表的長度 if self.is_empty(): return 0 #cur遊標,用來遍歷節點,count記錄數量 cur = self.__head count = 1 while cur.next != self.__head: count += 1 cur = cur.next return count def travel(self): #遍歷鏈表 if self.is_empty(): return cur = self.__head while cur.next != self.__head: print(cur.elem,end=‘ ‘) cur = cur.next #退出循環,cur指向尾節點,但尾節點的元素未打印 print(cur.elem) def add(self,item): #在鏈表頭部添加節點 node = Node(item) if self.is_empty(): self.__head = node node.next = node else: cur = self.__head while cur.next != self.__head: cur = cur.next #退出循環,cur指向尾節點 node.next = self.__head self.__head = node cur.next = node def append(self,item): #在鏈表尾部添加節點 node = Node(item) if self.is_empty(): self.__head = node node.next = node else: cur = self.__head while cur.next != self.__head: cur = cur.next node.next = self.__head cur.next = node def insert(self,pos,item): #在鏈表指定位置添加節點 # pos從0開始 if pos <= 0: self.add(item) elif pos > (self.length()-1): self.append(item) else: pre = self.__head count = 0 while count < (pos-1): count += 1 pre = pre.next #當退出循環後,pre指向pos-1位置 node = Node(item) node.next = pre.next pre.next = node def remove(self,item): #移除節點 if self.is_empty(): return cur = self.__head pre = None while cur.next != self.__head: if cur.elem == item: #先判斷此節點是否是頭節點 if cur == self.__head: #頭節點的情況 #先找到尾節點 rear = self.__head while rear.next != self.__head: rear = rear.next self.__head = cur.next rear.next = self.__head else: #中間節點 pre.next = cur.next return else: pre = cur cur = cur.next #退出循環,cur指向尾節點 if cur.elem == item: if cur == self.__head: #鏈表只有一個節點 self.__head = None else: pre.next = cur.next def search(self,item): #查找節點 if self.is_empty(): return False cur = self.__head while cur.next != self.__head: if cur.elem == item: return True else: cur = cur.next #退出循環,cur指向尾節點 if cur.elem == item: return True return False if __name__ == ‘__main__‘: ll = SingleCycleLinkList() print(ll.is_empty()) print(ll.length()) ll.append(1) print(ll.is_empty()) print(ll.length()) ll.append(2) ll.add(8) ll.append(3) ll.append(4) ll.append(5) ll.append(6) ll.insert(-1,9) ll.travel() ll.insert(3,100) ll.travel() ll.insert(10,200) ll.travel() ll.remove(100) ll.travel() ll.remove(9) ll.travel() ll.remove(200) ll.travel() ‘‘‘ 運行結果: True 0 False 1 9 8 1 2 3 4 5 6 9 8 1 100 2 3 4 5 6 9 8 1 100 2 3 4 5 6 200 9 8 1 2 3 4 5 6 200 8 1 2 3 4 5 6 200 8 1 2 3 4 5 6 ‘‘‘View Code
python 鏈表實現 雙向鏈表