(牛客網刷題筆記:一) Python數據結構之鏈表(linked list)

Python數據結構之鏈表

一、鏈表的基本知識

最近在leetcode刷題時遇到了幾道關於鏈表的題,於是惡補了一下關於鏈表的知識。什麼是鏈表?熟悉python語法的同學肯定都知道list,但是這並不是真正意義上的鏈表(linked list)。鏈表是由一系列的節點(node)來實現的,通過每一個node存儲下一個節點的指針來實現一種快速的插入。此外每個節點都有一個cargo包含一定的數據。根據鏈表結構的不同,其種類可以分爲單向鏈表、單項循環鏈表、雙向鏈表、雙向循環鏈表等。

二、創建一個新鏈表

由於鏈表的功能是依靠節點來完成的,所以鏈表的建立必然要先建立節點類。我們通過節點間傳遞值的方式將指針指向下一個節點。如下代碼是一個鏈表的創建,下一節將介紹如何遍歷(traverse)鏈表。

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None
         
li = SLinkedList()
li.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

# 連接第一第二個節點
li.headval.nextval = e2

# 連接第二第三個節點
e2.nextval = e3

print(e2.nextval)
#結果爲e3內存地址<__main__.Node object at 0x0000001A0F9644BE0>
print(e2.nextval.dataval)
#結果爲e3所代表的值Wed

三、鏈表遍歷

在創建完鏈表之後,可以通過輸入第一個節點的方式遍歷整個鏈表

#在鏈表末尾添加一個新的node
    def append(self, newdata):
        NewNode = Node(newdata)
        if self.headval is None:
            self.headval = NewNode
            return
        laste = self.headval
        while(laste.nextval):
            laste = laste.nextval
        laste.nextval=NewNode

# 打印鏈表
    def show(self):
        printval = self.headval
        while printval:
            print (printval.dataval)
            printval = printval.nextval

結果是:

Mon
Tue
Wed
Thu

四、插入

在鏈表中插入一個元素指的是將指針從一個已經存在的節點指向一個新插入的節點。取決於不同的插入位置,主要有以下幾種情形。

1、插入在鏈表開頭

在開頭插入一個節點顧名思義是將原來的節點變爲第二個節點即可,後續排列順序不變。

#插入在開頭位置,鏈表左側   
    def add_left(self,newdata):
        NewNode = Node(newdata)

結果:

Sun
Mon
Tue
Wed
複製代碼

2、插入在鏈表末尾

和插入在開頭類似,需要做的是將原本鏈表末尾的指針指向新的節點,即原本最後一個指針變爲倒數第二個,新節點變成最後一個節點。

#添加道末尾
def append(self, newdata):
        NewNode = Node(newdata)
        #判斷是否原鏈表沒有節點,如果沒有,該節點就是第一個節點
        if not self.headval:
            self.headval = NewNode
            return
        laste = self.headval
        #while執行後,laste.nextval如果一直存在,遍歷直至原鏈表最後一個
        while(laste.nextval):
            laste = laste.nextval
        #在原最後一個節點之後再續一個節點
        laste.nextval=NewNode

li.append("Thu")

li.show()

結果:

Mon
Tue
Wed
Thu

3、在兩個元素中間插入

如果大家向在鏈表中間插入一個節點,又該怎麼辦呢?相信大家在熟悉了前兩種插入模式後,對在鏈表中間插入應該也能掌握吧。沒錯,他們都是異曲同工的。同樣是在指針上做文章。把需要插入位置的前一個指針指向新節點,將新節點的指針指向插入位置的下一個節點即可。

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

# 添加節點
    def insert(self,middle_node,newdata):
        if not middle_node:
            print("The mentioned node is absent")
            return

        NewNode = Node(newdata)
        NewNode.nextval = middle_node.nextval
        middle_node.nextval = NewNode

# 打印列表
    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval


li = SLinkedList()
li.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Thu")

li.headval.nextval = e2
e2.nextval = e3

li.insert(list.headval.nextval,"Fri")

li.show()

結果:

Mon
Tue
Fri
Thu

五、刪除鏈表元素

講完了增加,那麼緊接着的便是刪除啦。

class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None

class SLinkedList:
    def __init__(self):
        self.head = None

    def add_left(self, data_in):
        NewNode = Node(data_in)
        NewNode.next = self.head
        self.head = NewNode
		
# 刪除節點
    def remove(self, Removekey):

        HeadVal = self.head

        if not HeadVal:
            if (HeadVal.data == Removekey):
                self.head = HeadVal.next
                HeadVal = None
                return

        while not HeadVal:
            if HeadVal.data == Removekey:
                break
            prev = HeadVal
            HeadVal = HeadVal.next

        if (HeadVal == None):
            return

        prev.next = HeadVal.next

        HeadVal = None

    def show(self):
        printval = self.head
        while (printval):
            print(printval.data),
            printval = printval.next


li = SLinkedList()
li.add_left("Mon")
li.add_left("Tue")
li.add_left("Wed")
li.add_left("Thu")
li.add_left("Tue")
li.show()

結果:

Thu
Wed
Mon
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章