1. 程式人生 > >python---循環雙向鏈表實現

python---循環雙向鏈表實現

while ret 只有一個 sel nod list.sh count one 條件

這個方案裏的尾插入,就使用了更高效的prev指標。

但感覺remove的代碼不夠和前面統一,

我有代碼潔癖了????

# coding = utf-8


# 雙向鏈表
class Node:

    # 雙向鏈表存在兩個指標,一個向前,一個向後
    def __init__(self, new_data):
        self.data = new_data
        self.prev = None
        self.next = None

    def get_data(self):
        return self.data

    
def set_data(self, new_data): self.data = new_data def get_next(self): return self.next def set_next(self, new_next): self.next = new_next def get_prev(self): return self.prev def set_prev(self, new_prev): self.prev = new_prev
class DoubleCycleList: def __init__(self): self.head = None # 作頭插入時,需要要註意插入順序, # 總之。要註意不要丟失next和prev。 def add(self, item): node = Node(item) # 如果鏈表是空的,則node的next和prev都指向自己(因為是雙向循環) if self.is_empty(): node.set_next(node) node.set_prev(node)
# 將head指向node self.head = node else: # node的next設為現在的head node.set_next(self.head) # node的prev 設為現在head的prev node.set_prev(self.head.get_prev()) # 現在head的前一個元素的next設為node self.head.get_prev().set_next(node) # 現在head的前驅 改為node self.head.set_prev(node) # 將head指向node self.head = node # 作尾插入 def append(self, item): node = Node(item) if self.is_empty(): # 如果當前鏈表是空的 那就調用頭部插入方法 self.add(item) else: # #因為是雙向循環鏈表,所以head的prev其實就是鏈表的尾部 # node的下一個設為頭 node.set_next(self.head) # node的前驅設為現在頭部的前驅 node.set_prev(self.head.get_prev()) # 頭部前驅的後繼設為node self.head.get_prev().set_next(node) # 頭部自己的前驅改為node self.head.set_prev(node) # 指定位置插入節點 def insert(self, pos, item): # 相當於頭插入 if pos <= 0: self.add(item) # 相當於尾插入 elif pos >= self.size(): self.append(item) else: node = Node(item) count = 0 current = self.head # 在要插入位置的前一個元素,這時候停下 while count < pos - 1: count += 1 current = current.get_next() # node的後繼設為cur的後繼 node.set_next(current.get_next()) # node的前驅設為cur node.set_prev(current) # cur後繼的前驅改為node current.get_next().set_prev(node) # cur後繼改為node current.set_next(node) # 刪除指定節點數據 def remove(self, item): if self.is_empty(): # 如果鏈表為空 直接不操作 return else: current = self.head if current.get_data == item: # 如果頭結點就是 要刪除的元素 if self.size() == 1: # 如果只有一個節點 鏈表就空了 head設為None self.head = None else: # 頭指針指向cur的下一個 self.head = current.get_next() # cur後繼的前驅改為cur的前驅 current.get_next().set_prev(current.get_prev()) # cur前驅的後繼改為cur的後繼 current.get_prev().set_next(current.get_next()) else: current = current.get_next() # 循環讓cur後移一直到鏈表尾元素位置,期間如果找得到就刪除節點,找不到就跳出循環 while current is not self.head: if current.get_data() == item: # cur的前驅的後繼改為cur的後繼 current.get_prev().set_next(current.get_next()) # cur的後繼的前驅改為cur的前驅 current.get_next().set_prev(current.get_prev()) current = current.get_next() # 查找指定數據是否存在 def search(self, item): current = self.head found = False while current is not self.head: if current.get_data() == item: found = True current = current.get_next() if current.get_data() == item: found = True return found def is_empty(self): return self.head is None def __len__(self): return self.size() def size(self): # 循環鏈表和非循環鏈表的退出條件不一樣 count = 0 current = self.head while current.get_next() is not self.head: count += 1 current = current.get_next() return count def show(self): current = self.head # 循環鏈表和非循環鏈表的讀取首個元素也不同 print(current.get_data(), end= ) while current.get_next() is not self.head: current = current.get_next() print(current.get_data(), end= ) print() if __name__ == __main__: d_list = DoubleCycleList() print(d_list.is_empty()) d_list.add(5) d_list.add(4) d_list.add(76) d_list.add(23) d_list.show() d_list.append(48) d_list.show() d_list.append(234) d_list.show() d_list.insert(2, 100) d_list.show() d_list.remove(5) d_list.show() print(d_list.search(48))

True
23 76 4 5 
23 76 4 5 48 
23 76 4 5 48 234 
23 76 100 4 5 48 234 
23 76 100 4 48 234 
False

Process finished with exit code 0

python---循環雙向鏈表實現