標籤:link 思想 object ret 對象 ext 操作 代碼 __name__
class Node(object): def __init__(self, data): self.data = data self.next = None self.pre = Noneclass DLinkList(object): def __init__(self, node=None): self.__head = node self.cur = self.__head def is_empty(self): """ 鏈表是否為空白 :return: """ return self.__head == None def __len__(self): """ 鏈表長度 :return: """ count = 0 cur = self.__head # while迴圈條件不同,count也應該從不同開始。這裡的條件可以有兩種 # cur None cur.next None,採用cur None 是因為 count=0 正好滿足空鏈表的情況 while cur != None: count += 1 cur = cur.next return count def append(self, data): """ 尾部添加 :param data: :return: """ node = Node(data) if self.is_empty(): self.__head = node self.cur = self.__head return cur = self.__head while cur.next != None: cur = cur.next # 退出while迴圈的時候, 此時當前節點cur 的位置是最後一個節點 cur.next = node node.pre = cur def add(self, data): """ 頭部添加 :return: """ node = Node(data) if self.is_empty(): self.__head = node return node.next = self.__head self.__head.pre = node self.__head = node self.cur = self.__head def __iter__(self): return self def __next__(self): if self.cur != None: data = self.cur.data self.cur = self.cur.next return data else: raise StopIteration def pop(self): """ 從末尾彈出元素 :return: """ pre = None cur = self.__head while cur.next != None: pre = cur cur = cur.next pre.next = None def remove(self, data): """ 刪除指定數值元素 :param data: :return: """ cur = self.__head pre = None while cur != None: if cur.data == data: # 如果是前端節點 if cur == self.__head: self.__head = cur.next cur.next.pre = None self.cur = self.__head # 中間節點和尾節點 else: pre.next = cur.next cur.next.pre = pre break else: pre = cur cur = cur.next def insert(self, pos, data): """ 在指定位置插入元素,pos 從 0 開始 :param pos: :param data: :return: """ if pos == 0: self.add(data) elif pos >= len(self): self.append(data) else: count = 0 node = Node(data) cur = self.__head pre = None while count < pos: pre = cur cur = cur.next count += 1 pre.next = node node.pre = pre node.next = cur cur.pre = nodeif __name__ == '__main__': l = DLinkList() l.append(1) l.append(2) l.add(3) l.insert(1,77) l.pop() for i in l: print(i)
總結:
- 對於一些邏輯判斷可能會比較複雜,所以應該先按照正常邏輯處理一般情況,然後再在之前寫的代碼的基礎上考慮特殊情況
- while迴圈的條件和外面的計數器是相關的,對於while迴圈的理解一定得到位,而且當while迴圈退出的時候變數處於的值應該就是臨界條件,明確什麼條件走入迴圈,迴圈體和迴圈條件的同非同步關係
- 物件導向的思想正好體現在這個方面,屏蔽外界操作,有些操作內部完成,封裝
- python變數的實質,a=5, a並不是5這個記憶體位址的別名,而是開闢兩塊空間,一塊是5,一塊存5的地址
- 分清一個變數的使用和引用,放在等號右邊就是使用這個變數
python實現雙向鏈表