Python實現雙向連結串列的基本操作
雙向連結串列也叫雙鏈表,是連結串列的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向連結串列中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈連結串列。
程式碼實現:
# coding = utf-8
# 定義節點類
class Node(object):
def __init__(self, data):
# 定義資料域
self.data = data
# 定義後指向域
self.next = None
# 定義前指向域
self.prev = None
# 定義雙向連結串列類
class Double_List(object):
def __init__(self):
# 定義連結串列頭
self._head = Node(None)
# 定義連結串列長度
self._length = 0
def is_empty(self):
if self._length == 0:
return True
else:
return False
#迴圈遍歷節點
def travel(self):
# 定義遊標
cur = self._head
for i in range(self._length):
print(cur.next.data, end=" ")
cur = cur.next
else:
print(" ")
#尾部新增節點
def append(self, data):
# 構造新節點
new_code = Node(data)
# 建立遊標
cur = self._head
for i in range(self._length):
# 移動遊標
cur = cur.next
else:
# 插入新節點:
# 1.讓新節點有所指向
new_code.prev = cur
# 2.讓與新節點有關的節點有所指向
cur.next = new_code
# 連結串列長度加1
self._length += 1
def insert(self, pos, data):
# 判斷pos有效性
if isinstance(pos, int):
if pos < 0:
dl.insert(0, data)
elif pos > self._length:
dl.append(data)
else:
# 建立新節點
new_code = Node(data)
# 建立遊標
cur = self._head
for i in range(self._length):
if i == pos:
# 插入新節點:
# 1.讓新節點有所指向
new_code.prev = cur
new_code.next =cur.next
# 2.讓與新節點有關的節點有所指向
cur.next = new_code
new_code.next.prev =new_code
# 連結串列長度更新
self._length += 1
return
else:
cur = cur.next
else:
print("pos資料無效!")
def remove(self, data):
if self.is_empty():
print("list is empty")
else:
cur = self._head
for i in range(self._length):
if cur.next.data == data:
if cur.next.next is None:
# 尾部節點刪除
cur.next = None
else:
# 刪除中間節點
# 1.讓中間節點前的節點的next指向中間節點的後節點
cur.next = cur.next.next
# 2.讓中間節點後的節點的prev指向中間節點的前節點
cur.next.prev = cur
# 更新連結串列長度
self._length -= 1
return
else:
cur = cur.next
else:
print("{} is not in".format(data), end="")
if __name__ == "__main__":
print("尾部 插 入: ",end="")
dl = Double_List()
for i in range(10):
dl.append(i)
dl.travel()
print("任意位置插入:", end="")
dl.insert(-100, "a")
dl.insert(6, "x")
dl.insert(100, "z")
dl.travel()
print("刪除 節 點 :",end="")
dl.remove("a")
dl.remove("x")
dl.remove("z")
dl.travel()
dl.remove("xxx")
dl.travel()
程式執行結果;
尾 部 插 入: 0 1 2 3 4 5 6 7 8 9
任意位置插入:a 0 1 2 3 4 x 5 6 7 8 9 z
刪 除 節 點 :0 1 2 3 4 5 6 7 8 9
xxx is not in 0 1 2 3 4 5 6 7 8 9