網站首頁 編程語言 正文
本文實例為大家分享了Python代碼實現雙鏈表的具體代碼,供大家參考,具體內容如下
雙鏈表的每個節點有兩個指針: 一個指向后一個節點,另一個指向前一個節點
class Node(object):
?? ?def __init__(self, item=None):
?? ??? ?#放數據
?? ??? ?self.item= item
?? ??? ?#指向后一個節點
?? ??? ?self.next = None
?? ??? ?#指向前一個節點
?? ??? ?self.prior =None
此時當前鏈表第一個節點就是頭節點指向的節點 20就是第一個節點 下圖
node.next = self.head 當前節點指向原第一個節點
頭插法
如何插入呢
插入
p.next = curNode.next #指向后一個節點
curNode.next.prior = p #指向前一個節點
刪除
雙鏈表刪除
考慮特殊情況刪除的
正常刪除
雙鏈表刪除 30
#雙鏈表頭插法
#停在前一個位置了
count < (pos -1 )
#雙向鏈表 ?從左往右讀
class Node(object):
? ? ? ? """雙向鏈表節點"""
? ? ? ? def __init__(self,item):
? ? ? ? ? ? ? ? #放數據的節點
? ? ? ? ? ? ? ? self.elem = item
? ? ? ? ? ? ? ? #指向后一個節點
? ? ? ? ? ? ? ? self.next = None
? ? ? ? ? ? ? ? #指向前一個節點
? ? ? ? ? ? ? ? self.prev = None
#雙向鏈表
class LinkList(object):
? ? ? ? def __init__(self,node=None):
? ? ? ? ? ? ? ? #代表頭節點
? ? ? ? ? ? ? ? self.__head = node
? ? ? ? #判斷鏈表是否為空
? ? ? ? def is_empty(self):
? ? ? ? ? ? ? ? return self.__head == None
? ? ? ? def length(self):
? ? ? ? ? ? ? ? """返回鏈表的長度"""
? ? ? ? ? ? ? ? #cur游標移動,從而實現遍歷元素的功能
? ? ? ? ? ? ? ? cur = self.__head
? ? ? ? ? ? ? ? #count用來計數
? ? ? ? ? ? ? ? count = 0
? ? ? ? ? ? ? ? while cur != None:
? ? ? ? ? ? ? ? ? ? ? ? count += 1
? ? ? ? ? ? ? ? ? ? ? ? #讓cur游標可以向下移動
? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next
? ? ? ? ? ? ? ? return count
? ? ? ? #遍歷整個鏈表
? ? ? ? def travel(self):
? ? ? ? ? ? ? ? if self.is_empty():
? ? ? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? #建立游標等于起始節點
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? cur = self.__head
? ? ? ? ? ? ? ? ? ? ? ? while cur != None:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print(cur.elem,end=" ")
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next
? ? ? ? ? ? ? ? ? ? ? ? print("")
? ? ? ? #頭插法
? ? ? ? def add(self,item):
? ? ? ? ? ? ? ? #新節點
? ? ? ? ? ? ? ? node = Node(item)
? ? ? ? ? ? ? ? if self.is_empty():
? ? ? ? ? ? ? ? ? ? ? ? #頭節點指向了新的節點
? ? ? ? ? ? ? ? ? ? ? ? self.__head = node
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? #新節點指向原第一個節點
? ? ? ? ? ? ? ? ? ? ? ? node.next = self.__head
? ? ? ? ? ? ? ? ? ? ? ? self.__head = node
? ? ? ? ? ? ? ? ? ? ? ? node.next.prev = node
? ? ? ? def append(self,item):
? ? ? ? ? ? ? ? """鏈表尾部添加元素"""
? ? ? ? ? ? ? ? node = Node(item) ?#定義新節點
? ? ? ? ? ? ? ? #鏈表是否為空鏈表
? ? ? ? ? ? ? ? if self.is_empty():
? ? ? ? ? ? ? ? ? ? ? ? #如果為空,新的節點加了進去
? ? ? ? ? ? ? ? ? ? ? ? self.__head = node
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? #頭節點 創建游標
? ? ? ? ? ? ? ? ? ? ? ? cur = self.__head ? #設置指向頭結點的游標 ?此時的當前鏈表第一個節點,就是頭節點指向的節點
? ? ? ? ? ? ? ? ? ? ? ? #cur到最后一個節點停下
? ? ? ? ? ? ? ? ? ? ? ? while cur.next != None:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next
? ? ? ? ? ? ? ? ? ? ? ? #添加節點到尾部 cur道了最后一個結點 ?cur.next指向了新的節點node ?從左往右讀 ?
? ? ? ? ? ? ? ? ? ? ? ? cur.next = node
? ? ? ? ? ? ? ? ? ? ? ? #當前的節點指向它前一個
? ? ? ? ? ? ? ? ? ? ? ? node.prev = cur
? ? ? ? #插入法 ?#pos從零開始
? ? ? ? def insert(self,pos,item):
? ? ? ? ? ? ? ? """在指定位置添加元素"""
? ? ? ? ? ? ? ? #指向不是頭部元素,self.__head的地址
? ? ? ? ? ? ? ? # 為下一個元素,所以pre為下一個元素
? ? ? ? ? ? ? ? if pos <= 0:
? ? ? ? ? ? ? ? ? ? ? ? #認為是頭插法
? ? ? ? ? ? ? ? ? ? ? ? self.add(item)
? ? ? ? ? ? ? ? #假如長度是3 pos大于2要特殊處理 ?
? ? ? ? ? ? ? ? elif pos > (self.length()-1):
? ? ? ? ? ? ? ? ? ? ? ? #尾插法
? ? ? ? ? ? ? ? ? ? ? ? self.append(item)
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ?? ??? ?#創建節點 新節點
? ? ? ? ? ? ? ? ? ? ? ? node = Node(item)
? ? ? ? ? ? ? ? ? ? ? ? cur = self.__head
? ? ? ? ? ? ? ? ? ? ? ? count = 0
? ? ? ? ? ? ? ? ? ? ? ? #動起來
? ? ? ? ? ? ? ? ? ? ? ? while count < pos:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count+=1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? #把節點鏈接到中間任意位置 插入前一個節點 ? 此時,cur停在后一個節點
? ? ? ? ? ? ? ? ? ? ? ? node.next = cur
? ? ? ? ? ? ? ? ? ? ? ? node.prev = cur.prev
? ? ? ? ? ? ? ? ? ? ? ? cur.prev.next = node
? ? ? ? ? ? ? ? ? ? ? ? cur.prev = node
? ? ? ? def remove(self,item):
? ? ? ? ? ? ? ? """刪除元素"""
? ? ? ? ? ? ? ? if self.is_empty():
? ? ? ? ? ? ? ? ?? ?return
? ? ? ? ? ? ? ? cur = self.__head
? ? ? ? ? ? ? ? #查找所有的位置有沒有要刪除的,若有則刪除
? ? ? ? ? ? ? ? while cur != None:
? ? ? ? ? ? ? ? ?? ??? ?#判斷cur指向的數據,是否為要刪除的數據 ? item要刪除的元素
? ? ? ? ? ? ? ? ? ? ? ? if cur.elem == item:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #判斷此節點是否為頭節點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #考慮特殊情況,恰好要刪除是第一個元素 ? ?當前的元素就是我要刪除的元素?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if cur == self.__head:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #如果刪除中間, ?頭節點指向后一個節點?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? self.__head = cur.next
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #考慮鏈表只有一個節點 ?直接指向None
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if cur.next != None:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #是否只有一個節點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur.next.prev = None
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #中間節點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur.prev.next = cur.next
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if cur.next != None:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur.next.prev = cur.prev
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #沒有找到,cur游標向繼續往下移動
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next
? ? ? ? def search(self,item):
? ? ? ? ? ? ? ? """查找結點是否存在"""
? ? ? ? ? ? ? ? #如果是一個空鏈表
? ? ? ? ? ? ? ? if self.is_empty():
? ? ? ? ? ? ? ? ? ? ? ? return False
? ? ? ? ? ? ? ? cur = self.__head
? ? ? ? ? ? ? ? while cur.next != self.__head:
? ? ? ? ? ? ? ? ? ? ? ? #cur數據是否為查找的數據 item是要查的數據?
? ? ? ? ? ? ? ? ? ? ? ? if cur.elem == item:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return True
? ? ? ? ? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next
? ? ? ? ? ? ? ? #遍歷完成 cur指向None
? ? ? ? ? ? ? ? return False
if __name__ == '__main__':
? ? ? ? ll = LinkList()
? ? ? ? #第一次的
? ? ? ? print(ll.is_empty())
? ? ? ? print(ll.length())
? ? ? ? ll.append(1)
? ? ? ? print(ll.is_empty())
? ? ? ? print(ll.length())
? ? ? ? ll.append(2)
? ? ? ? ll.append(3)
? ? ? ? ll.append(4)
? ? ? ? ll.append(5)
? ? ? ? ll.travel()
? ? ? ? ll.insert(-1,50)
? ? ? ? ll.travel()
? ? ? ? ll.insert(2,60)
? ? ? ? ll.travel()
? ? ? ? ll.insert(10,300)
? ? ? ? ll.travel()
? ? ? ? ll.remove(50)
? ? ? ? ll.travel()
? ? ? ? ll.remove(300)
? ? ? ? ll.travel()
原文鏈接:https://blog.csdn.net/u012164509/article/details/102878519
相關推薦
- 2022-09-15 Python利用psutil實現獲取硬件,網絡和進程信息_python
- 2022-11-24 Linux實現文件定期本地備份/異地備份/刪除備份的腳本_linux shell
- 2022-04-01 Prometheus處理metrics標簽
- 2022-07-02 C++?OpenCV讀寫XML或YAML文件的方法詳解_C 語言
- 2022-10-27 python使用pika庫調用rabbitmq交換機模式詳解_python
- 2022-05-20 Maven的配置及使用
- 2022-01-16 jQuery實現動畫效果和導航欄動態顯示
- 2022-05-06 python?selenium中Excel數據維護指南_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支