python之資料結構與演算法分析

專注的阿熊發表於2021-04-30

python 實現單向連結串列

class Node(object):

     def __init__(self, elem):

         """

         :param elem: 表元素域

         next :下一結點連結域

         cursor(cur) :遊標

         """

         self.elem = elem

         # 定義 next 指向空

         self.next = None

class SingleLinkList(object):

     """

     單向連結串列也叫單連結串列,是連結串列中最簡單的一種形式,它的每個節點包含兩個域,一個資訊域 ( 元素域 ) 和一個連結域。這個連結指向連結串列中的下一一個節點,外匯跟單gendan5.com而最後 - 個節點的連結域則指向一個空值。

     表元素域 elem 用來存放具體的資料。

     連結域 next 用來存放下一個節點的位置 (python 中的標識 )

     變數 p 指向連結串列的頭節點 ( 首節點 ) 的位置,從 p 出發能找到表中的任意節點。

     """

     def __init__(self, node=None):

         self.__head = node  # node.elem node.next

     def is_empty(self):

         """ 連結串列是否為空    """

         return self.__head is None

     def length(self):

         """ 連結串列長度 """

         # cur 遊標,用來移動遍歷節點

         cur = self.__head

         count = 0

         while cur is not None:

             count += 1

             cur = cur.next

             # count 記錄數量

         return count

     def travel(self):

         """ 遍歷整個連結串列 """

         cur = self.__head

         while cur is not None:

             print(cur.elem, end=' ')

             cur = cur.next

     def add(self, item):

         """ 連結串列頭部新增元素:頭插法 """

         node = Node(item)

         node.next = self.__head

         self.__head = node

     def append(self, item):

         """ 連結串列尾部新增元素 : 尾插法 """

         node = Node(item)

         # 下一結點連結域不為空

         if self.is_empty():

             self.__head = node

         else:

             cur = self.__head

             while cur.next is not None:

                 cur = cur.next

             cur.next = node

     def insert(self, pos, item):

         """

         pos: pos 0 開始

         pre: 指定節點前一節點,相當於遊標

         node :插入的指定節點

         指定位置新增元素

         """

         # if pos<=0 頭插法

         if pos <= 0:

             self.add(item)

         # elif pos>(self.length()-1) 尾插法

         elif pos > (self.length() - 1):

             self.append(item)

         # else 插入法

         else:

             pre = self.__head

             count = 0

             # 當迴圈退出後, pre 指向 pos-1

             while count < (pos - 1):

                 count += 1

                 pre = pre.next

             node = Node(item)

             node.next = pre.next

             pre.next = node

     def remove(self, item):

         """ 刪除元素 """

         # 考慮刪除頭部、尾部、中間節點

         cur = self.__head

         pre = None

         while cur is not None:

             if cur.elem == item:

                 # 先判斷是否是頭節點

                 if cur == self.__head:

                     self.__head = cur.next

                 else:

                     pre.next = cur.next

                 break

             else:

                 pre = cur

                 cur = cur.next

     def search(self, item):

         """ 查詢節點是否存在 """

         # 1. 建立遊標

         cur = self.__head

         # 2. 遍歷遊標

         while cur is not None:

             # 3. cur.elem = item

             if cur.elem == item:

                 return True

             else:

                 cur = cur.next

         return False

if __name__ == '__main__':

     ll = SingleLinkList()

     ll.is_empty()

     l1 = ll.length()

     print(l1)

     ll.append(55)

     ll.is_empty()

     l2 = ll.length()

     print(l2)

     ll.append(2)

     ll.add(8)

     ll.append(3)

     ll.append(4)

     ll.append(5)

     # 55 1 8 2 3 4

     ll.insert(-1, 9)  # 9 8 55 2 1 8 2345

     ll.insert(2, 100)  # 9 8 100 55 2 1 8 2345

     ll.travel()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2770711/,如需轉載,請註明出處,否則將追究法律責任。

相關文章