雙鏈表及python程式碼實現
阿新 • • 發佈:2019-01-28
引言
雙向連結串列比之單向連結串列,多數操作方法的實現都沒有什麼不同,如is_empty, len, traverse, search。這些方法都沒有涉及節點的變動,也就可通過繼承單向連結串列來實現即可。
不同之處一是在於節點實現的不同。因為增加了指向前一個節點的前驅區,因此需要為節點新增一個新屬性prev,用以指向前一個節點。
另外一點就是在做增刪的操作時,需要額外考慮節點的前驅區的指向。其中的remove方法更是需要考慮多種特殊情況。
下面給出程式碼前,先放一個自己做的圖示。(右鍵選擇在新頁面開啟可看完整圖示)
程式碼
class Node(object):
def __init__(self, value):
self.value = value
# 前驅區
self.prev = None
# 後繼區
self.next = None
class LinkedListTwoway(object):
def __init__(self):
self.__head = None
def is_empty(self):
return self.__head is None
def __len__(self):
count = 0
cur = self.__head
while cur:
count += 1
cur = cur.next
return count
def traverse(self):
cur = self.__head
while cur:
print(cur.value)
cur = cur.next
def add(self, value):
node = Node(value)
if self.is_empty():
self.__head = node
else:
# 待插入節點的後繼區指向原頭節點
node.next = self.__head
# 原頭節點的前驅區指向待插入節點
self.__head.prev = node
self.__head = node
def append(self, value):
node = Node(value)
cur = self.__head
if self.is_empty():
self.__head = Node
return
while cur.next:
cur = cur.next
cur.next = node
node.prev = cur
def insert(self, pos, value):
if pos <= 0:
self.add(value)
elif pos > len(self) - 1:
self.append(value)
else:
# 單向連結串列中為了在特定位置插入,要先在連結串列中找到待插入位置和其前一個位置
# 雙向連結串列中就不需要兩個遊標了(當然單向連結串列中一個遊標也是可以只找前一個位置)
node = Node(value)
count = 0
cur = self.__head
while count < pos - 1:
count += 1
cur = cur.next
# 此時的遊標指向pos的前一個位置
# 這裡的相互指向需尤為注意,有多種實現,需細細分析
node.next = cur.next
cur.next.prev = node
node.prev = cur
cur.next = node
def search(self, value):
cur = self.__head
while cur:
if cur.value == value:
return True
else:
cur = cur.next
return False
def remove(self, value):
if self.is_empty():
return
cur = self.__head
while cur:
if cur.value == value:
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
return
else:
cur = cur.next