Python 數據結構之單向鏈表的實現

鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是不像順序表一樣連續存儲數據,而是在每一個節點(數據存儲單元)裏存放下一個節點的位置信息(即地址)。
爲什麼需要鏈表:

  • 順序表的構建需要預先知道數據大小來申請連續的存儲空間,而在進行擴充時又需要進行數據的搬遷,所以使用起來並不是很靈活。
  • 鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。

單向鏈表:單向鏈表也叫單鏈表,是鏈表中最簡單的一種形式,它的每個節點包含兩個域,一個信息域(元素域)和一個鏈接域。這個鏈接指向鏈表中的下一個節點,而最後一個節點的鏈接域則指向一個空值。

# 單鏈表基於Python語言的實現
'''
單向鏈表需要實現的方法:
is_empty() 鏈表是否爲空
len() 鏈表長度
travel() 遍歷整個鏈表
add(item) 鏈表頭部添加元素
append(item) 鏈表尾部添加元素
insert(pos, item) 指定位置添加元素
remove(item) 刪除節點
search(item) 查找節點是否存在
'''

class Node(object):
    """
    節點類
    """
    def __init__(self, value):
        # 元素域
        self.value = value
        # 鏈接域
        self.next = None


class OneWayLinkList(object):
    """
    單向鏈表類
    """
    def __init__(self, node=None):
        # 初始化頭節點
        self.__head = node

    def __len__(self):
        """
        返回鏈表長度
        """
        # 遊標,用來遍歷鏈表
        cur = self.__head
        # 記錄遍歷次數
        count = 0
        # 當前節點爲None則說明已經遍歷完畢
        while cur:
            count += 1
            cur = cur.next
        return count

    def is_empty(self):
        """
        判斷鏈表是否爲空
        """
        # 頭節點不爲None則不爲空
        return self.__head == None

    def add(self, value):
        """
        頭部插法
        先讓新節點的next指向頭節點
        再將頭節點替換爲新節點
        順序不可錯,要先保證原鏈表的鏈不斷,否則頭節點後面的鏈會丟失
        """
        node = Node(value)
        node.next = self.__head
        self.__head = node

    def append(self, value):
        """
        尾部插法
        """
        node = Node(value)
        cur = self.__head
        if self.is_empty():
            self.__head = node
        else:
            while cur.next:
                cur = cur.next
            cur.next = node

    def insert(self, pos, value):
        """
        指定位置插入元素
        """
        # 應對特殊情況
        if pos <= 0:
            self.add(value)
        elif pos > len(self) - 1:
            self.append(value)
        else:
            node = Node(value)
            prior = self.__head
            count = 0
            # 在插入位置的前一個節點停下
            while count < (pos - 1):
                prior = prior.next
                count += 1
            # 先將插入節點與節點後的節點連接,防止鏈表斷掉,先鏈接後面的,再鏈接前面的
            node.next = prior.next
            prior.next = node

    def remove(self, value):
        """
        移除元素
        """
        cur = self.__head
        prior = None
        while cur:
            if value == cur.value:
                # 判斷此節點是否是頭節點
                if cur == self.__head:
                    self.__head = cur.next
                else:
                    prior.next = cur.next
                break
            # 還沒找到節點,繼續遍歷
            else:
                prior = cur
                cur = cur.next

    def search(self, value):
        """
        搜索元素
        """
        cur = self.__head
        while cur:
            if value == cur.value:
                return True
            cur = cur.next
        return False

    def travel(self):
        """
        遍歷鏈表
        """
        cur = self.__head
        while cur:
            print(cur.value)
            cur = cur.next
    

if __name__ == "__main__":
    link_list = OneWayLinkList()
    link_list.append('a')
    link_list.append('b')
    link_list.append('d')
    # link_list.insert(2, 'c')
    link_list.travel()
    print(len(link_list))
    print(link_list.search(3))
發佈了264 篇原創文章 · 獲贊 202 · 訪問量 110萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章