日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python實(shí)現(xiàn)雙向鏈表基本操作_python

作者:蕾歐娜等等 ? 更新時(shí)間: 2022-07-23 編程語(yǔ)言

雙向鏈表的基本操作的實(shí)現(xiàn),供大家參考,具體內(nèi)容如下

在之前的博客中介紹了三種鏈表,分別是單鏈表、單向循環(huán)鏈表以及雙向鏈表。本篇博客將用Python來(lái)實(shí)現(xiàn)雙向鏈表的如下操作。(用到的工具是Python 3)

is_empty() : 判斷鏈表是否為空
length() : 返回鏈表的長(zhǎng)度
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):
?? ??? ?'''返回鏈表的長(zhǎng)度'''
?? ??? ?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

原文鏈接:https://blog.csdn.net/weixin_38746310/article/details/106598545

欄目分類
最近更新