算法—详细讲解单向链表的实现(python)
鏈表
鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu)
數(shù)據(jù)元素的邏輯順序通過鏈表中的指針鏈接次序?qū)崿F(xiàn)
鏈表由一系列節(jié)點(diǎn)組成,節(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成
每個(gè)節(jié)點(diǎn)包含兩個(gè)部分:存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)區(qū)、存儲(chǔ)下一個(gè)節(jié)點(diǎn)地址的指針域
每去存儲(chǔ)一個(gè)數(shù)據(jù)就去申請(qǐng)一個(gè)節(jié)點(diǎn)
單向鏈表特點(diǎn):
無法根據(jù)某一個(gè)節(jié)點(diǎn)去訪問前一個(gè)節(jié)點(diǎn)
第一個(gè)節(jié)點(diǎn)為頭節(jié)點(diǎn)
最后一個(gè)節(jié)點(diǎn)的指針域?yàn)榭?#xff0c;稱為尾節(jié)點(diǎn)
單向鏈表的實(shí)現(xiàn)
鏈表頭部新增一個(gè)節(jié)點(diǎn)
新建一個(gè)節(jié)點(diǎn)
node=Node(data)if not self.head:# 再讓鏈表的head指向當(dāng)前node節(jié)點(diǎn)self.head = nodeelse:# 先讓node指向當(dāng)前鏈表中的頭節(jié)點(diǎn)node.next=self.head#再讓鏈表的head指向當(dāng)前node節(jié)點(diǎn)self.head=node#添加節(jié)點(diǎn)之后,鏈表的長(zhǎng)度加1self._length+=1鏈表尾部新增一個(gè)節(jié)點(diǎn)
新建一個(gè)節(jié)點(diǎn)node,值為data
node=Node(data)# 找到鏈表的尾節(jié)點(diǎn)# 思路:從頭節(jié)點(diǎn)開始遍歷鏈表中的所有節(jié)點(diǎn)# 每次判斷當(dāng)前節(jié)點(diǎn)的next是否為空# 為空這說明當(dāng)前節(jié)點(diǎn)就是尾節(jié)點(diǎn)# 不為空,通過當(dāng)前節(jié)點(diǎn)的next方法去訪問下一個(gè)節(jié)點(diǎn),if self.head:cur=self.head #將頭節(jié)點(diǎn)的地址賦給了變量curwhile cur.next:cur=cur.nextcur.next = nodeelse:self.head=node# 讓當(dāng)前的尾節(jié)點(diǎn)的指針指向新建的節(jié)點(diǎn)node# 鏈表的長(zhǎng)度加1self._length+=1
鏈表中插入一個(gè)新的節(jié)點(diǎn)
刪除鏈表中第一個(gè)值為data的節(jié)點(diǎn)
一、當(dāng)刪除的節(jié)點(diǎn)為頭節(jié)點(diǎn)時(shí):
二、當(dāng)刪除的節(jié)點(diǎn)為非頭節(jié)點(diǎn)
修改鏈表中指定位置的值
if 0<pos<self._length:cur = self.headwhile pos:cur = cur.nextpos -= 1cur.data=dataelse:print('輸入的范圍不符合要求')
查找鏈表中是否有節(jié)點(diǎn)的值為data
代碼塊為:
class Node:def __init__(self, data, _next=None):self.data = data # 數(shù)據(jù)域self.next = _next # 指針域class SingleLinkList:def __init__(self):self.head = None # 鏈表的的頭節(jié)點(diǎn)self._length = 0 # 鏈表的長(zhǎng)度,鏈表的元素個(gè)數(shù)def is_empty(self):# 判斷鏈表的是否為空return self._length==0def length(self):# 返回鏈表的長(zhǎng)度return self._lengthdef nodes_list(self):# 返回鏈表中的所有節(jié)點(diǎn)的值組成的列表res=[]cur=self.headwhile cur:res.append(cur.data)cur=cur.nextreturn resdef add(self, data):# 往鏈表的頭部添加一個(gè)節(jié)點(diǎn),值為data# 新建一個(gè)節(jié)點(diǎn)node=Node(data)# 先讓node指向當(dāng)前鏈表中的頭節(jié)點(diǎn)node.next=self.head#再讓鏈表的head指向當(dāng)前node節(jié)點(diǎn)self.head=node#添加節(jié)點(diǎn)之后,鏈表的長(zhǎng)度加1self._length+=1def append(self, data):# 往鏈表的尾部添加一個(gè)節(jié)點(diǎn),值為data# 新建一個(gè)節(jié)點(diǎn)node,值為datanode=Node(data)# 找到鏈表的尾節(jié)點(diǎn)# 思路:從頭節(jié)點(diǎn)開始遍歷鏈表中的所有節(jié)點(diǎn)# 每次判斷當(dāng)前節(jié)點(diǎn)的next是否為空# 為空這說明當(dāng)前節(jié)點(diǎn)就是尾節(jié)點(diǎn)# 不為空,通過當(dāng)前節(jié)點(diǎn)的next方法去訪問下一個(gè)節(jié)點(diǎn),if self.head:cur=self.head #將頭節(jié)點(diǎn)的地址賦給了變量curwhile cur.next:cur=cur.nextcur.next = nodeelse:self.head=node# 讓當(dāng)前的尾節(jié)點(diǎn)的指針指向新建的節(jié)點(diǎn)node# 鏈表的長(zhǎng)度加1self._length+=1def insert(self, pos, data):# 往鏈表的指定位置插入一個(gè)節(jié)點(diǎn),值為dataif pos<=0:self.add(data)elif pos>self._length:self.append(data)else:# 1新建一個(gè)節(jié)點(diǎn)node = Node(data)# 2找到鏈表中索引為pos-1的節(jié)點(diǎn)cur=self.headwhile pos-1:cur=cur.nextpos-=1#到這里之后,cur指向的是索引為pos-1的節(jié)點(diǎn)# 3讓node的next指向索引為pos的節(jié)點(diǎn)node.next=cur.next# 4讓索引為pos-1的節(jié)點(diǎn)的next指向nodecur.next=node# 5鏈表的長(zhǎng)度加1self._length+=1def remove(self, data):# 刪除鏈表中第一個(gè)值為data的節(jié)點(diǎn)cur=self.headprev=None #要?jiǎng)h除節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)while cur:if cur.data==data:#如果前驅(qū)節(jié)點(diǎn)為空,說明我們要?jiǎng)h除的節(jié)點(diǎn)是第一個(gè)節(jié)點(diǎn)if not prev:self.head=cur.nextelse:prev.next = cur.nextself._length-=1return 0prev=curcur = cur.nextreturn -1def modify(self, pos,data):# 修改鏈表中指定位置節(jié)點(diǎn)的值if 0<pos<self._length:cur = self.headwhile pos:cur = cur.nextpos -= 1cur.data=dataelse:print('輸入的范圍不符合要求')def search(self, data):# 查找鏈表中是否有節(jié)點(diǎn)的值為datacur = self.headwhile cur:if cur.data == data:return Truecur = cur.nextreturn Falseif __name__ == '__main__':l1=SingleLinkList() #新建一個(gè)鏈表類print(l1.head,l1.length())l1.add(1)print(l1.head.data, l1.length())總結(jié)
以上是生活随笔為你收集整理的算法—详细讲解单向链表的实现(python)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 栈——用顺序表实现栈操作
- 下一篇: 栈——用链表实现栈操作