1. 程式人生 > >Python實現雙向連結串列的基本操作

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