Python實(shí)現(xiàn)雙向鏈表基本操作
雙向鏈表的基本操作的實(shí)現(xiàn),供大家參考,具體內(nèi)容如下
在之前的博客中介紹了三種鏈表,分別是單鏈表、單向循環(huán)鏈表以及雙向鏈表。本篇博客將用Python來實(shí)現(xiàn)雙向鏈表的如下操作。(用到的工具是Python 3)
is_empty() : 判斷鏈表是否為空
length() : 返回鏈表的長度
travel() : 遍歷
add(item) : 在頭部添加一個(gè)節(jié)點(diǎn)
append(item) : 在尾部添加一個(gè)節(jié)點(diǎn)
insert(pos, item) : 在指定位置 pos 添加一個(gè)節(jié)點(diǎn)
remove(item) : 刪除一個(gè)節(jié)點(diǎn)
search(item) : 查找節(jié)點(diǎn)是否存在
Python實(shí)現(xiàn)
class Node(object):
?? ?'''雙向鏈表節(jié)點(diǎn)'''
?? ?def __init__(self,item):
?? ??? ?self.item = item
?? ??? ?self.next = None
?? ??? ?self.prev = None
class DoubleLink(object):
?? ?'''雙向鏈表'''
?? ?def __init__(self):
?? ??? ?self._head = None
?? ?
?? ?def is_empty(self):
?? ??? ?'''判斷是否為空'''
?? ??? ?return self._head == None
?? ?
?? ?def length(self):
?? ??? ?'''返回鏈表的長度'''
?? ??? ?cur = self._head
?? ??? ?count = 0
?? ??? ?while cur!= None:
?? ??? ??? ?count += 1
?? ??? ??? ?cur = cur.next
?? ??? ?return count
?? ?
?? ?def travel(self):
?? ??? ?'''遍歷鏈表'''
?? ??? ?cur = self._head
?? ??? ?while cur != None:
?? ??? ??? ?print(cur.item)
?? ??? ??? ?cur = cur.next
?? ??? ?print("")
?? ?
?? ?def add(self, item):
?? ??? ?'''頭部插入元素'''
?? ??? ?node = Node(item)
?? ??? ?if self.is_empty():
?? ??? ??? ?# 如果是空鏈表,將_head指向None
?? ??? ??? ?self._head = node
?? ??? ?else:
?? ??? ??? ?# 將node的next指向_head的頭節(jié)點(diǎn)
?? ??? ??? ?node.next = self._head
?? ??? ??? ?# 將_head的頭節(jié)點(diǎn)的prev指向node
?? ??? ??? ?self._head.prev = node
?? ??? ??? ?# 將_head 指向node
?? ??? ??? ?self._head = node
?? ?
?? ?def append(self, item):
?? ??? ?'''尾部插入元素'''
?? ??? ?node = Node(item)
?? ??? ?if self.is_empty():
?? ??? ??? ?self._head = node
?? ??? ?else:
?? ??? ??? ?# 移動(dòng)到鏈表尾部
?? ??? ??? ?cur = self._head
?? ??? ??? ?while cur.next != None:
?? ??? ??? ??? ?cur = cur.next
?? ??? ??? ?# 將尾結(jié)點(diǎn)cur的next指向node
?? ??? ??? ?cur.next = node
?? ??? ??? ?# 將node的prev指向cur
?? ??? ??? ?node.prev = cur
?? ?
?? ?def search(self, item):
?? ??? ?'''查找元素是否存在'''
?? ??? ?cur = self._head
?? ??? ?while cur != None:
?? ??? ??? ?if cur.item == item:
?? ??? ??? ??? ?return True
?? ??? ??? ?cur = cur.next
?? ??? ?return False指定位置插入節(jié)點(diǎn)
在該操作中,要注意鏈的指向的先后順序。

def insert(self, pos, item): ?? ??? ?'''在指定位置添加節(jié)點(diǎn)''' ?? ??? ?if pos <= 0: ?? ??? ??? ?self.add(item) ?? ??? ?elif pos > (self.length() - 1): ?? ??? ??? ?self.append(item) ?? ??? ?else: ?? ??? ??? ?node = Node() ?? ??? ??? ?cur = self._head() ?? ??? ??? ?count = 0 ?? ??? ??? ?# 移動(dòng)到指定的前一個(gè)位置 ?? ??? ??? ?while cur < pos - 1 : ?? ??? ??? ??? ?count += 1 ?? ??? ??? ??? ?cur = cur.next ?? ??? ??? ?# 將node的prev指向cur ?? ??? ??? ?node.prev = cur ?? ??? ??? ?# 將node的next指向cur的下一個(gè)節(jié)點(diǎn) ?? ??? ??? ?node.next = cur.next ?? ??? ??? ?# 將cur的下一個(gè)節(jié)點(diǎn)的prev指向node ?? ??? ??? ?cur.next.prev = node ?? ??? ??? ?# 將cur.next指向node ?? ??? ??? ?cur.next = node
刪除元素

def remove(self, item): ?? ??? ?'''刪除元素''' ?? ??? ?if self.is_empty(): return? ?? ??? ?else: ?? ??? ??? ?cur = self._head ?? ??? ??? ?if cur.item == item: ?? ??? ??? ??? ?# 如果首節(jié)點(diǎn)的元素是要?jiǎng)h除的元素 ?? ??? ??? ??? ?if cur.next == None: ?? ??? ??? ??? ??? ?# 如果鏈表中只有一個(gè)節(jié)點(diǎn) ?? ??? ??? ??? ??? ?self._head = None ?? ??? ??? ??? ?else: ?? ??? ??? ??? ??? ?cur.next.prev = None ?? ??? ??? ??? ??? ?self._head = cur.next ?? ??? ??? ??? ?return ?? ??? ??? ?while cur != None: ?? ??? ??? ??? ?if cur.item == item: ?? ??? ??? ??? ??? ?cur.prev.next = cur.next ?? ??? ??? ??? ??? ?cur.next.prev = cur.prev ?? ??? ??? ??? ??? ?break ?? ??? ??? ??? ?cur = cur.next
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python腳本來控制Windows Azure的簡(jiǎn)單教程
這篇文章主要介紹了使用Python腳本來控制Windows Azure的簡(jiǎn)單教程,由于微軟官方提供了Python SDK,使得用戶自己用Python控制Azure成為了可能,需要的朋友可以參考下2015-04-04
Pandas時(shí)間序列:時(shí)期(period)及其算術(shù)運(yùn)算詳解
今天小編就為大家分享一篇Pandas時(shí)間序列:時(shí)期(period)及其算術(shù)運(yùn)算詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python實(shí)現(xiàn)一個(gè)自助取數(shù)查詢工具
在數(shù)據(jù)生產(chǎn)應(yīng)用部門,取數(shù)分析是一個(gè)很常見的需求,實(shí)際上業(yè)務(wù)人員需求時(shí)刻變化,最高效的方式是讓業(yè)務(wù)部門自己來取,減少不必要的重復(fù)勞動(dòng),本文介紹如何用Python實(shí)現(xiàn)一個(gè)自助取數(shù)查詢工具2021-06-06
在Python中居然可以定義兩個(gè)同名通參數(shù)的函數(shù)
今天小編就為大家分享一篇在Python中居然可以定義兩個(gè)同名通參數(shù)的函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
python實(shí)現(xiàn)復(fù)制文件到指定目錄
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)復(fù)制文件到指定的目錄下,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
python 自動(dòng)化辦公之批量修改文件名實(shí)操
這篇文章主要介紹了python 自動(dòng)化辦公之批量修改文件名實(shí)操,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
使用Python和GDAL給圖片加坐標(biāo)系的實(shí)現(xiàn)思路(坐標(biāo)投影轉(zhuǎn)換)
這篇文章主要介紹了使用Python和GDAL給圖片加坐標(biāo)系的實(shí)現(xiàn)思路(坐標(biāo)投影轉(zhuǎn)換),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03

