python中的單向鏈表實現


引子

數據結構指的是是數據的組織的方式。從單個數據到一維結構(線性表),二維結構(樹),三維結構(圖),都是組織數據的不同方式。

為什么需要鏈表?  

順序表的構建需要預先知道數據大小來申請連續的存儲空間,而在進行擴充時又需要進行數據的搬遷,所以使用起來並不是很靈活。

鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。

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

什么是單鏈表?

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

 

 

單鏈表應當支持哪些基本操作?

  • is_empty() 鏈表是否為空
  • length() 鏈表長度
  • travel() 遍歷整個鏈表
  • add(item) 鏈表頭部添加元素
  • append(item) 鏈表尾部添加元素
  • insert(pos, item) 指定位置添加元素
  • remove(item) 刪除節點
  • search(item) 查找節點是否存在 

操作圖解:

add

insert

remove

 

代碼實現

注意點:

因為沒有計數,因此諸多操作都離不開遍歷,何時停止不可迷糊。另外,不要忘記經常要考慮的特殊情況。如果為空會如何?如果鏈表中只有一個節點會如何?構造新鏈時,該遵循怎樣的順序?(先保證原鏈不斷)

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


class LinkedListOneway(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 traverse(self):
        cur = self.__head
        while cur:
            print(cur.value)
            cur = cur.next

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM