日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

算法—详细讲解单向链表的实现(python)

發(fā)布時(shí)間:2025/3/21 python 8 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法—详细讲解单向链表的实现(python) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏈表

鏈表是一種物理存儲(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)

if 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+=1


刪除鏈表中第一個(gè)值為data的節(jié)點(diǎn)

一、當(dāng)刪除的節(jié)點(diǎn)為頭節(jié)點(diǎn)時(shí):

二、當(dāng)刪除的節(jié)點(diǎn)為非頭節(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 = c

修改鏈表中指定位置的值

if 0<pos<self._length:cur = self.headwhile pos:cur = cur.nextpos -= 1cur.data=dataelse:print('輸入的范圍不符合要求')


查找鏈表中是否有節(jié)點(diǎn)的值為data

例如:search(4)cur = self.headwhile cur:if cur.data == data:return Truecur = cur.nextreturn False

代碼塊為:

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。