1. 程式人生 > 程式設計 >python單向迴圈連結串列原理與實現方法示例

python單向迴圈連結串列原理與實現方法示例

本文例項講述了python單向迴圈連結串列原理與實現方法。分享給大家供大家參考,具體如下:

單向迴圈連結串列

單鏈表的一個變形是單向迴圈連結串列,連結串列中最後一個節點的next域不再為None,而是指向連結串列的頭節點。

操作

  • is_empty() 判斷連結串列是否為空
  • length() 返回連結串列的長度
  • travel() 遍歷
  • add(item) 在頭部新增一個節點
  • append(item) 在尾部新增一個節點
  • insert(pos,item) 在指定位置pos新增節點
  • remove(item) 刪除一個節點
  • search(item) 查詢節點是否存在

實現

# -*- coding:utf-8 -*-
#! python3
class Node(object):
  """節點"""
  def __init__(self,item):
    self.item = item
    self.next = None
class SinCycLinkedlist(object):
  """單向迴圈連結串列"""
  def __init__(self):
    self.__head = None
  def is_empty(self):
    """判斷連結串列是否為空"""
    return self.__head == None
  def length(self):
    """返回連結串列的長度"""
    # 如果連結串列為空,返回長度0
    if self.is_empty():
      return 0
    count = 1
    cur = self.__head
    while cur.next != self.__head:
      count += 1
      cur = cur.next
    return count
  def travel(self):
    """遍歷連結串列"""
    if self.is_empty():
      return
    cur = self.__head
    print(cur.item,)
    while cur.next != self.__head:
      cur = cur.next
      print(cur.item,)
    print("")
  def add(self,item):
    """頭部新增節點"""
    node = Node(item)
    if self.is_empty():
      self.__head = node
      node.next = self.__head
    else:
      # 新增的節點指向_head
      node.next = self.__head
      # 移到連結串列尾部,將尾部節點的next指向node
      cur = self.__head
      while cur.next != self.__head:
        cur = cur.next
      cur.next = node
      # _head指向新增node的
      self.__head = node
  def append(self,item):
    """尾部新增節點"""
    node = Node(item)
    if self.is_empty():
      self.__head = node
      node.next = self.__head
    else:
      # 移到連結串列尾部
      cur = self.__head
      while cur.next != self.__head:
        cur = cur.next
      # 將尾節點指向node
      cur.next = node
      # 將node指向頭節點_head
      node.next = self.__head
  def insert(self,pos,item):
    """在指定位置新增節點"""
    if pos <= 0:
      self.add(item)
    elif pos > (self.length() - 1):
      self.append(item)
    else:
      node = Node(item)
      cur = self.__head
      count = 0
      # 移動到指定位置的前一個位置
      while count < (pos - 1):
        count += 1
        cur = cur.next
      node.next = cur.next
      cur.next = node
  def remove(self,item):
    """刪除一個節點"""
    # 若連結串列為空,則直接返回
    if self.is_empty():
      return
    # 將cur指向頭節點
    cur = self.__head
    pre = None
    while cur.next != self.__head:
      if cur.item == item:
        # 先判斷此結點是否是頭節點
        if cur == self.__head:
          # 頭節點的情況
          # 找尾節點
          rear = self.__head
          while rear.next != self.__head:
            rear = rear.next
          self.__head = cur.next
          rear.next = self.__head
        else:
          # 中間節點
          pre.next = cur.next
        return
      else:
        pre = cur
        cur = cur.next
    # 退出迴圈,cur指向尾節點
    if cur.item == item:
      if cur == self.__head:
        # 連結串列只有一個節點
        self.__head = None
      else:
        # pre.next = cur.next
        pre.next = self.__head
  def search(self,item):
    """查詢節點是否存在"""
    if self.is_empty():
      return False
    cur = self.__head
    if cur.item == item:
      return True
    while cur.next != self.__head:
      cur = cur.next
      if cur.item == item:
        return True
    return False
if __name__ == "__main__":
  ll = SinCycLinkedlist()
  ll.add(1)
  ll.add(2)
  ll.append(3)
  ll.insert(2,4)
  ll.insert(4,5)
  ll.insert(0,6)
  print("length:",ll.length())
  ll.travel()
  print(ll.search(3))
  print(ll.search(7))
  ll.remove(1)
  print("length:",ll.length())
  ll.travel()

執行結果:

length: 6
6
2
1
4
3
5

True
False
length: 5
6
2
4
3
5

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python資料結構與演算法教程》、《Python加密解密演算法與技巧總結》、《Python編碼操作技巧總結》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》及《Python入門與進階經典教程》

希望本文所述對大家Python程式設計有所幫助。