1. 程式人生 > 其它 >python 實現迴圈連結串列

python 實現迴圈連結串列

# -*- coding: utf-8 -*-#
# -------------------------------------------------------------------------------
# Name:         單鏈表測試
# Author:       yunhgu
# Date:         2022/3/10 15:48
# Description: 
# -------------------------------------------------------------------------------
class Node(object):
    """連結串列的結點"""

    def __init__(self, item):
        # item存放資料元素
        self.item = item
        # next是下一個節點的標識
        self.next = None


class SingleCycleLinkList(object):

    def __init__(self):
        self._head = None

    def is_empty(self):
        """判斷連結串列是否為空"""
        return self._head is None

    def length(self):
        """連結串列長度"""
        # 連結串列為空
        if self.is_empty():
            return 0
        # 連結串列不為空
        count = 1
        cur = self._head
        while cur.next != self._head:
            count += 1
            # 指標下移
            cur = cur.next
        return count

    def items(self):
        """ 遍歷連結串列 """
        # 連結串列為空
        if self.is_empty():
            return
        # 連結串列不為空
        cur = self._head
        while cur.next != self._head:
            yield cur.item
            cur = cur.next
        yield cur.item

    def add(self, item):
        """ 頭部新增結點"""
        node = Node(item)
        if self.is_empty():  # 為空
            self._head = node
            node.next = self._head
        else:
            # 新增結點指向head
            node.next = self._head
            cur = self._head
            # 移動結點,將末尾的結點指向node
            while cur.next != self._head:
                cur = cur.next
            cur.next = node
        # 修改 head 指向新結點
        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
            # 尾部指標指向新結點
            cur.next = node
            # 新結點指標指向head
            node.next = self._head

    def insert(self, index, item):
        """ 指定位置新增結點"""
        if index <= 0:  # 指定位置小於等於0,頭部新增
            self.add(item)
        # 指定位置大於連結串列長度,尾部新增
        elif index > self.length() - 1:
            self.append(item)
        else:
            node = Node(item)
            cur = self._head
            # 移動到新增結點位置
            for i in range(index - 1):
                cur = cur.next
            # 新結點指標指向舊結點
            node.next = cur.next
            # 舊結點指標 指向 新結點
            cur.next = node

    def remove(self, item):
        """ 刪除一個結點 """
        if self.is_empty():
            return
        cur = self._head
        pre = Node
        # 第一個元素為需要刪除的元素
        if cur.item == item:
            # 連結串列不止一個元素
            if cur.next != self._head:
                while cur.next != self._head:
                    cur = cur.next
                # 尾結點指向 頭部結點的下一結點
                cur.next = self._head.next
                # 調整頭部結點
                self._head = self._head.next
            else:
                # 只有一個元素
                self._head = None
        else:
            # 不是第一個元素
            pre = self._head
            while cur.next != self._head:
                if cur.item == item:
                    # 刪除
                    pre.next = cur.next
                    return True
                else:

                    pre = cur  # 記錄前一個指標
                    cur = cur.next  # 調整指標位置
        # 當刪除元素在末尾
        if cur.item == item:
            pre.next = self._head
            return True

    def find(self, item):
        """ 查詢元素是否存在"""
        return item in self.items()


if __name__ == '__main__':
    link_list = SingleCycleLinkList()
    print(link_list.is_empty())
    # 頭部新增元素
    for i in range(5):
        link_list.add(i)
    print(list(link_list.items()))
    # 尾部新增元素
    for i in range(6):
        link_list.append(i)
    print(list(link_list.items()))
    # 新增元素
    link_list.insert(3, 45)
    print(list(link_list.items()))
    # 刪除元素
    link_list.remove(5)
    print(list(link_list.items()))
    # 元素是否存在
    print(4 in link_list.items())
    print(link_list.find(0))