Python數據結構之鏈表

Python數據結構之鏈表

1、鏈表的基本知識

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

2、建立一個新鏈表

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

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

3、鏈表遍歷

在建立完鏈表以後,能夠經過輸入第一個節點的方式遍歷整個鏈表數據結構

#在鏈表末尾添加一個新的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 not printval:
            print (printval.dataval)
            printval = printval.nextval

結果是:app

Mon
Tue
Wed
Thu

4、插入

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

一、插入在鏈表開頭

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

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

結果:htm

Sun
Mon
Tue
Wed

二、插入在鏈表末尾

和插入在開頭相似,須要作的是將本來鏈表末尾的指針指向新的節點,即本來最後一個指針變爲倒數第二個,新節點變成最後一個節點。內存

#添加道末尾
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()

結果:leetcode

Mon
Tue
Wed
Thu

三、在兩個元素中間插入

若是你們向在鏈表中間插入一個節點,又該怎麼辦呢?相信你們在熟悉了前兩種插入模式後,對在鏈表中間插入應該也能掌握吧。沒錯,他們都是殊途同歸的。一樣是在指針上作文章。把須要插入位置的前一個指針指向新節點,將新節點的指針指向插入位置的下一個節點便可。rem

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

5、刪除鏈表元素

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

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

參考:tutorialspoint

相關文章
相關標籤/搜索