python 链表的基础概念和基础用法
生活随笔
收集整理的這篇文章主要介紹了
python 链表的基础概念和基础用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、什么是鏈表
鏈表是由多個不同的節點組成,每個節點通過指針區域關聯到一起
鏈表的頭指針,指向了頭節點,通過頭指針可以找到其他節點信息
二、什么是節點
鏈表由節點組成,每個節點又包含兩個部分,一個是元素區域,一個是指針區域。
元素區域存儲的是,當前節點的數值,指針區域指向下一個節點的對象。在C語言中,指針應該是指向下一個元素的的內存地址,因python中不研究指針,這里用下一個節點的對象代替。這樣我們就能通過指針區域,找到下一個節點的信息,從而得到下一個節點的值了。
三、為什么引入鏈表的概念
1.先說說數組這種數據結構吧,數組是一塊大的連續內存空間。每次初始化需要開辟一大塊內存空間,空間利用率比較低。而鏈表則不同,鏈表的節點可以隨機分布在任何位置,只需通過指針穿引起來即可。
2.在連續的內存空間中,插入一個元素時,所有其他元素的位置也變動了。插入元素、刪除元素時候,效率比較低。
鏈表是非連續的內存空間,每個節點單獨存在自己的內存空間,通過指針指向下一個節點。
如果在某個地方插入一個節點,只需要改變指針的指向即可,不用其他元素都變動。
四、鏈表的基本操作
# 實現頭部插入 尾部插入 根據索引插入 刪除節點并print 打印 # 定義一個節點 class Node:def __init__(self, data):self.data = dataself.next = Noneclass SingleLinkList:def __init__(self):self.head = Noneself.tail = Nonedef is_empty(self):"""鏈表是否為空:return:"""return self.head is Nonedef length(self):"""求當前鏈表的長度:return:"""count = 0cur = self.headwhile cur is not None:count += 1cur = cur.nextreturn countdef insert_head_node(self, data):"""鏈表頭部添加元素:param data: 要保存的數據:return:"""node = Node(data)node.next = self.headself.head = nodedef append_node(self, data):"""鏈表尾部添加元素,有多種實現方式:param data::return:"""# 第一種方式 時間復雜度為O(n)的處理方式node = Node(data)# 如果鏈表為空,需要特殊處理if self.is_empty():self.head = nodeelse:cur = self.headwhile cur.next is not None:cur = cur.next# 退出循環時, cur指向尾節點cur.next = node# 第二種 引入一個tail指針 默認當前鏈表為一個空鏈表,不停的去append節點# node = Node(data)# if self.is_empty(): # 當第一次添加節點到空鏈表中的時候,頭指針和尾指針同時指向新節點# self.head = node# self.tail = node# else:# 當再次添加節點到鏈表中的時候, 頭指針始終指向頭節點,尾指針始終執行未節點,如果一直向未節點追加節點,只需移動tail指針即可# self.tail.next = node# self.tail = nodedef insert_node(self, pos, data):"""指定位置添加元素:param pos::param data::return:"""# 1, 在頭部添加if pos <= 0:self.insert_head_node(data)# 2, 在尾部添加elif self.length() >= pos:self.append_node(data)# 3, 指定位置添加else:count = 0while count < (pos - 2):count += 1self.head = self.head.next# 這時候self.head 表示當前插入前一個節點# self.head.next 表示當前插入的后一個節點node = Node(data)self.head.next = nodenode.next = self.head.nextdef delete_node(self, data):"""刪除節點:param data::return:"""cur = self.head # 記錄當前節點的位置pre = None # 記錄當前節點位置的前置節點while cur is not None:# 找到了要刪除的元素if cur.data == data:# 在頭部找到了要刪除的元素if cur == self.head:self.head = cur.nextreturn Trueelse:pre.next = cur.nextreturn Trueelse:# 不是要找的元素, 移動光標pre = curcur = cur.nextdef search_node(self, data):"""查找節點是否存在:return:"""cur = self.headwhile cur is not None:if cur.data == data:return Truecur = cur.nextreturn Falsedef reveres_node(self):"""鏈表反轉:return:"""if self.is_empty():returnj = 0while j < self.length() - 1:cur = self.headfor i in range(self.length() - 1):cur = cur.nextif cur.next is None:x = cur.dataself.delete_node(cur.data)self.insert_node(j, x)j += 1return self.head總結
以上是生活随笔為你收集整理的python 链表的基础概念和基础用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 包管理工具poetry
- 下一篇: python 链表两数相加