最近在leetcode刷題時遇到了幾道關於鏈表的題,因而惡補了一下關於鏈表的知識。什麼是鏈表?熟悉python語法的同窗確定都知道list,可是這並非真正意義上的鏈表(linked list)。鏈表是由一系列的節點(node)來實現的,經過每個node存儲下一個節點的指針來實現一種快速的插入。此外每一個節點都有一個cargo包含必定的數據。根據鏈表結構的不一樣,其種類能夠分爲單向鏈表、單項循環鏈表、雙向鏈表、雙向循環鏈表等。node
因爲鏈表的功能是依靠節點來完成的,因此鏈表的創建必然要先創建節點類。咱們經過節點間傳遞值的方式將指針指向下一個節點。以下代碼是一個鏈表的建立,下一節將介紹如何遍歷(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
在建立完鏈表以後,能夠經過輸入第一個節點的方式遍歷整個鏈表數據結構
#在鏈表末尾添加一個新的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
在鏈表中插入一個元素指的是將指針從一個已經存在的節點指向一個新插入的節點。取決於不一樣的插入位置,主要有如下幾種情形。指針
在開頭插入一個節點顧名思義是將原來的節點變爲第二個節點便可,後續排列順序不變。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
講完了增長,那麼緊接着的即是刪除啦。
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