【數據結構專項】鏈表(6) —— 管理單向鏈表的基本類(包含頭結點)

class SinglyLinkedList:
    """管理單向鏈表的基本類(使用頭結點)"""

    class _Node:
        __slots__ = "value", "next"  # 因爲會創建很多個結點對象,因此使用__slots__來減少內存佔用

        def __init__(self, value, next=None):
            self.value = value
            self.next = next

        def __str__(self):
            return str(self.value) + "->" + str(self.next)

    def __init__(self):
        self._head = self._Node(None)
        self._size = 0

    def __len__(self):
        """返回鏈表中元素的數量"""
        return self._size

    def is_empty(self):
        """返回鏈表是否爲空"""
        return self._size == 0

    def get(self, index: int):
        """依據座標讀取變量"""
        if index < 0 or index >= self._size:
            return -1
        curr = self._head
        for _ in range(index + 1):
            curr = curr.next
        return curr.value

    def add_at_head(self, value):
        """在頭結點前添加結點"""
        self.add_at_index(0, value)

    def add_at_tail(self, value):
        """在尾結點之後添加結點"""
        self.add_at_index(self._size, value)

    def add_at_index(self, index: int, value):
        """在指定座標前添加結點(若座標無效則不添加)"""
        if index < 0 or index > self._size:
            return
        self._size += 1
        prev = self._head
        for _ in range(index):
            prev = prev.next
        node = self._Node(value, prev.next)
        prev.next = node

    def delete_at_index(self, index: int):
        """依據座標刪除結點(若座標無效則不刪除)"""
        if index < 0 or index >= self._size:
            return
        self._size -= 1
        prev = self._head
        for _ in range(index):
            prev = prev.next
        prev.next = prev.next.next
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章