您好,登錄后才能下訂單哦!
這篇文章主要介紹“python怎么實(shí)現(xiàn)單向鏈表”,在日常操作中,相信很多人在python怎么實(shí)現(xiàn)單向鏈表問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”python怎么實(shí)現(xiàn)單向鏈表”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
鏈表顧名思義是~鏈
鏈表是一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),其特點(diǎn)是使用一組任意的存儲(chǔ)單元來(lái)存儲(chǔ)數(shù)據(jù)元素。鏈表中的每個(gè)元素都成為一個(gè)“節(jié)點(diǎn)”,每個(gè)節(jié)點(diǎn)由一個(gè)數(shù)據(jù)字段和一個(gè)指針字段組成。與數(shù)組不同,鏈表不必預(yù)先定義大小,如果有硬件支持,它們可以無(wú)限擴(kuò)展。
陣列需要預(yù)定義的大小,無(wú)法適應(yīng)數(shù)據(jù)的動(dòng)態(tài)增減。如果數(shù)據(jù)小于定義的長(zhǎng)度,將會(huì)浪費(fèi)內(nèi)存。如果數(shù)據(jù)超過(guò)預(yù)定義的長(zhǎng)度,則無(wú)法插入。鏈表是動(dòng)態(tài)添加和刪除的數(shù)據(jù),可以隨意添加。
數(shù)組適合獲取元素的操作,可以直接獲取索引。鏈表獲取元素比較麻煩,需要一直找。但是它們適合添加和刪除,所以可以直接修改節(jié)點(diǎn)的指向。但是數(shù)組比較麻煩。例如,[1,2,3,4]需要在下標(biāo)1處插入-2,所以需要將[2,3,4]移回并賦值LS [1]=
數(shù)組從棧中分配空間,對(duì)于程序員來(lái)說(shuō)方便快捷,但是自由度很小。鏈表從堆中分配空間,自由度大,但是應(yīng)用管理麻煩。
'''節(jié)點(diǎn)類(lèi)' ' '
類(lèi)別節(jié)點(diǎn)(對(duì)象):
def__init__(self,data):
self.data=數(shù)據(jù)
self.nex=無(wú)
def__init__(self):
''初始化鏈接列表'''
self . head=None
def _ _ len _ _(self):
pre=self.head
長(zhǎng)度=0
while prep :
長(zhǎng)度=1
pre=pre.nex
返回長(zhǎng)度
添加節(jié)點(diǎn)相對(duì)簡(jiǎn)單。如果頭節(jié)點(diǎn)不存在,則當(dāng)前節(jié)點(diǎn)為頭節(jié)點(diǎn),否則,查找尾節(jié)點(diǎn),并將尾節(jié)點(diǎn)的下一個(gè)指向當(dāng)前節(jié)點(diǎn)(可以添加頭和尾兩個(gè)節(jié)點(diǎn),不必遞歸查找尾節(jié)點(diǎn))
''追加節(jié)點(diǎn)'''
defappend(自身,數(shù)據(jù)):
'''
1.頭是none :頭節(jié)點(diǎn)
2.tail.nex - node
:paramdata:
:return:
'''
節(jié)點(diǎn)=節(jié)點(diǎn)(數(shù)據(jù))
ifself.headisNone:
self.head=node
else:
pre=self.head
whilepre.nex:
pre=pre.nex
Pre.nex=node
獲取節(jié)點(diǎn)也相對(duì)容易,無(wú)非是判斷指標(biāo)值的正負(fù)
defget(自身,索引):
'''
:paramindex:
:return:
'''
index=indexifindex=0 elselen(self)索引
iflen(self)indexorindex0:
返回?zé)o
pre=self.head
whileindex:
pre=pre.nex
index-=1
Returnpre
查找當(dāng)前節(jié)點(diǎn)并分配它
''設(shè)置節(jié)點(diǎn)'''
defset(自身、索引、數(shù)據(jù)):
node=self.get(index)
ifnode:
node.data=數(shù)據(jù)
Returnnode
要插入一個(gè)節(jié)點(diǎn),需要找到前一個(gè)節(jié)點(diǎn)pre_node(索引索引為正或負(fù),前一個(gè)節(jié)點(diǎn)不同,需要判斷),然后將pre_node.nex指向當(dāng)前節(jié)點(diǎn)。同時(shí),將當(dāng)前節(jié)點(diǎn)的nex指向pre_node.nex.nex
''插入節(jié)點(diǎn)'''
定義插入(自身、索引、數(shù)據(jù)):
'''
1.1 .索引插入節(jié)點(diǎn)位置包括正數(shù)和負(fù)數(shù)
2.查找索引
-1-->pre_node的節(jié)點(diǎn) 3.pre_node.next-->node node.next-->pre_node.next.next 4.head :paramindex: :paramdata: :return: """ node=Node(data) ifabs(index+1)>len(self): returnFalse index=indexifindex>=0elselen(self)+index+1 ifindex==0: node.nex=self.head self.head=node else: pre=self.get(index-1) ifpre: nex=pre.nex pre.nex=node node.nex=nex else: returnFalse returnnode
刪除節(jié)點(diǎn),也要區(qū)分一下索引的正負(fù)。找到當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)pre_node和后一個(gè)節(jié)點(diǎn)next_node,將pre_node.nex–>next_node即可
"""刪除某個(gè)元素""" defdelete(self,index): f=indexifindex>0elseabs(index+1) iflen(self)<=f: returnFalse pre=self.head index=indexifindex>=0elselen(self)+index prep=None whileindex: prep=pre pre=pre.nex index-=1 ifnotprep: self.head=pre.nex else: prep.nex=pre.nex returnpre.data
反轉(zhuǎn)鏈表的實(shí)現(xiàn)有多種方式,比較簡(jiǎn)單的就是生成一個(gè)新的鏈表--》可以用數(shù)組存儲(chǔ)所有節(jié)點(diǎn)讓后倒序生成新的鏈表
在這里用下面這種方式生產(chǎn):
反轉(zhuǎn)鏈表就是將node.nex–>pre_node 遞歸實(shí)現(xiàn)即可,然后讓tail賦值為head
"""反轉(zhuǎn)鏈表""" def__reversed__(self): """ 1.pre-->next轉(zhuǎn)變?yōu)閚ext-->pre 2.pre若是head則把pre.nex-->None 3.tail-->self.head :return: """ defreverse(pre_node,node): ifpre_nodeisself.head: pre_node.nex=None ifnode: next_node=node.nex node.nex=pre_node returnreverse(node,next_node) else: self.head=pre_node returnreverse(self.head,self.head.nex)
將頭賦為空就好
"""清空鏈表""" defclear(self): self.head=None
到此,關(guān)于“python怎么實(shí)現(xiàn)單向鏈表”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。