<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了python實現雙連結串列的具體程式碼,供大家參考,具體內容如下
實現雙連結串列需要注意的地方
1、如何插入元素,考慮特殊情況:頭節點位置,尾節點位置;一般情況:中間位置
2、如何刪除元素,考慮特殊情況:頭結點位置,尾節點位置;一般情況:中間位置
1.構造節點的類和連結串列類
class Node: def __init__(self, data): self.data = data self.next = None self.previous = None class DoubleLinkList: '''雙連結串列''' def __init__(self, node=None): self._head = node
以下方法均在連結串列類中實現
2. 判斷連結串列是否為空
def is_empty(self): return self._head is None
3. 輸出連結串列的長度
def length(self): count = 0 if self.is_empty(): return count else: current = self._head while current is not None: count += 1 current = current.next return count
4. 遍歷連結串列
def travel(self): current = self._head while current is not None: print("{0}".format(current.data), end=" ") current = current.next print("")
5.頭插法增加新元素
def add(self, item): node = Node(item) # 如果連結串列為空,讓頭指標指向當前節點 if self.is_empty(): self._head = node # 注意插入的順序, else: node.next = self._head self._head.previous = node self._head = node
6. 尾插法增加新元素
def append(self, item): node = Node(item) # 如果連結串列為空,則直接讓頭指標指向該節點 if self.is_empty(): self._head = node # 需要找到尾節點,然後讓尾節點的與新的節點進行連線 else: current = self._head while current.next is not None: current = current.next current.next = node node.previous = current
7. 查詢元素是否存在連結串列中
def search(self, item): current = self._head found = False while current is not None and not found: if current.data == item: found = True else: current = current.next return found
8. 在某個位置中插入元素
def insert(self, item, pos): # 特殊位置,在第一個位置的時候,頭插法 if pos <= 0: self.add(item) # 在尾部的時候,使用尾插法 elif pos > self.length() - 1: self.append(item) # 中間位置 else: node = Node(item) current = self._head count = 0 while count < pos - 1: current = current.next count += 1 # 找到了要插入位置的前驅之後,進行如下操作 node.previous = current node.next = current.next current.next.previous = node current.next = node
# 換一個順序也可以進行 def insert2(self, item, pos): if pos <= 0: self.add(item) elif pos > self.length() - 1: self.append(item) else: node = Node(item) current = self._head count = 0 while count < pos: current = current.next count += 1 node.next = current node.previous = current.previous current.previous.next = node current.previous = node
9. 刪除元素
def remove(self, item): current = self._head if self.is_empty(): return elif current.data == item: # 第一個節點就是目標節點,那麼需要將下一個節點的前驅改為None 然後再將head指向下一個節點 current.next.previous = None self._head = current.next else: # 找到要刪除的元素節點 while current is not None and current.data != item: current = current.next if current is None: print("not found {0}".format(item)) # 如果尾節點是目標節點,讓前驅節點指向None elif current.next is None: current.previous.next = None # 中間位置,因為是雙連結串列,可以用前驅指標操作 else: current.previous.next = current.next current.next.previous = current.previous
# 第二種寫法 def remove2(self, item): """刪除元素""" if self.is_empty(): return else: cur = self._head if cur.data == item: # 如果首節點的元素即是要刪除的元素 if cur.next is None: # 如果連結串列只有這一個節點 self._head = None else: # 將第二個節點的prev設定為None cur.next.prev = None # 將_head指向第二個節點 self._head = cur.next return while cur is not None: if cur.data == item: # 將cur的前一個節點的next指向cur的後一個節點 cur.prev.next = cur.next # 將cur的後一個節點的prev指向cur的前一個節點 cur.next.prev = cur.prev break cur = cur.next
10. 演示
my_list = DoubleLinkList() print("add操作") my_list.add(98) my_list.add(99) my_list.add(100) my_list.travel() print("{:#^50}".format("")) print("append操作") my_list.append(86) my_list.append(85) my_list.append(88) my_list.travel() print("{:#^50}".format("")) print("insert2操作") my_list.insert2(66, 3) my_list.insert2(77, 0) my_list.insert2(55, 10) my_list.travel() print("{:#^50}".format("")) print("insert操作") my_list.insert(90, 4) my_list.insert(123, 5) my_list.travel() print("{:#^50}".format("")) print("search操作") print(my_list.search(100)) print(my_list.search(1998)) print("{:#^50}".format("")) print("remove操作") my_list.remove(56) my_list.remove(123) my_list.remove(77) my_list.remove(55) my_list.travel() print("{:#^50}".format("")) print("remove2操作") my_list.travel() my_list.remove2(100) my_list.remove2(99) my_list.remove2(98) my_list.travel()
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45