網站首頁 編程語言 正文
本文為大家分享了python鏈表的基礎概念和基礎用法,供大家參考,具體內容如下
一、什么是鏈表
鏈表是由多個不同的節點組成,每個節點通過指針區域關聯到一起
鏈表的頭指針,指向了頭節點,通過頭指針可以找到其他節點信息
二、什么是節點
鏈表由節點組成,每個節點又包含兩個部分,一個是元素區域,一個是指針區域。
元素區域存儲的是,當前節點的數值,指針區域指向下一個節點的對象。在C語言中,指針應該是指向下一個元素的的內存地址,因python中不研究指針,這里用下一個節點的對象代替。這樣我們就能通過指針區域,找到下一個節點的信息,從而得到下一個節點的值了。
三、為什么引入鏈表的概念
1.先說說數組這種數據結構吧,數組是一塊大的連續內存空間。每次初始化需要開辟一大塊內存空間,空間利用率比較低。而鏈表則不同,鏈表的節點可以隨機分布在任何位置,只需通過指針穿引起來即可。
2.在連續的內存空間中,插入一個元素時,所有其他元素的位置也變動了。插入元素、刪除元素時候,效率比較低。
鏈表是非連續的內存空間,每個節點單獨存在自己的內存空間,通過指針指向下一個節點。
如果在某個地方插入一個節點,只需要改變指針的指向即可,不用其他元素都變動。
四、鏈表的基本操作
# 實現頭部插入 尾部插入 根據索引插入 刪除節點并print 打印
# 定義一個節點
class Node:
? ? def __init__(self, data):
? ? ? ? self.data = data
? ? ? ? self.next = None
class SingleLinkList:
? ? def __init__(self):
? ? ? ? self.head = None
? ? ? ? self.tail = None
? ? def is_empty(self):
? ? ? ? """鏈表是否為空
? ? ? ? :return:
? ? ? ? """
? ? ? ? return self.head is None
? ? def length(self):
? ? ? ? """求當前鏈表的長度
? ? ? ? :return:
? ? ? ? """
? ? ? ? count = 0
? ? ? ? cur = self.head
? ? ? ? while cur is not None:
? ? ? ? ? ? count += 1
? ? ? ? ? ? cur = cur.next
? ? ? ? return count
? ? def insert_head_node(self, data):
? ? ? ? """鏈表頭部添加元素
? ? ? ? :param data: 要保存的數據
? ? ? ? :return:
? ? ? ? """
? ? ? ? node = Node(data)
? ? ? ? node.next = self.head
? ? ? ? self.head = node
? ? def append_node(self, data):
? ? ? ? """鏈表尾部添加元素,有多種實現方式
? ? ? ? :param data:
? ? ? ? :return:
? ? ? ? """
? ? ? ? # 第一種方式 ?時間復雜度為O(n)的處理方式
? ? ? ? node = Node(data)
? ? ? ? # 如果鏈表為空,需要特殊處理
? ? ? ? if self.is_empty():
? ? ? ? ? ? self.head = node
? ? ? ? else:
? ? ? ? ? ? cur = self.head
? ? ? ? ? ? while 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 = node
? ? def 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 = 0
? ? ? ? ? ? while count < (pos - 2):
? ? ? ? ? ? ? ? count += 1
? ? ? ? ? ? ? ? self.head = self.head.next
? ? ? ? ? ? # 這時候self.head 表示當前插入前一個節點
? ? ? ? ? ? # self.head.next 表示當前插入的后一個節點
? ? ? ? ? ? node = Node(data)
? ? ? ? ? ? self.head.next = node
? ? ? ? ? ? node.next = self.head.next
? ? def 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.next
? ? ? ? ? ? ? ? ? ? return True
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? pre.next = cur.next
? ? ? ? ? ? ? ? ? ? return True
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? # 不是要找的元素, 移動光標
? ? ? ? ? ? ? ? pre = cur
? ? ? ? ? ? ? ? cur = cur.next
? ? def search_node(self, data):
? ? ? ? """查找節點是否存在
? ? ? ? :return:
? ? ? ? """
? ? ? ? cur = self.head
? ? ? ? while cur is not None:
? ? ? ? ? ? if cur.data == data:
? ? ? ? ? ? ? ? return True
? ? ? ? ? ? cur = cur.next
? ? ? ? return False
? ? def reveres_node(self):
? ? ? ? """鏈表反轉
? ? ? ? :return:
? ? ? ? """
? ? ? ? if self.is_empty():
? ? ? ? ? ? return
? ? ? ? j = 0
? ? ? ? while j < self.length() - 1:
? ? ? ? ? ? cur = self.head
? ? ? ? ? ? for i in range(self.length() - 1):
? ? ? ? ? ? ? ? cur = cur.next
? ? ? ? ? ? ? ? if cur.next is None:
? ? ? ? ? ? ? ? ? ? x = cur.data
? ? ? ? ? ? ? ? ? ? self.delete_node(cur.data)
? ? ? ? ? ? ? ? ? ? self.insert_node(j, x)
? ? ? ? ? ? j += 1
? ? ? ? return self.head
原文鏈接:https://blog.csdn.net/python_tian/article/details/121308698
相關推薦
- 2022-09-14 React?UI組件庫之快速實現antd的按需引入和自定義主題_React
- 2021-11-25 vc控制臺程序關閉事件時的處理方式及注意點詳解_C 語言
- 2022-08-16 C#?winform?請求http的實現(get,post)_C#教程
- 2022-11-25 詳解Python中的數據精度問題_python
- 2022-08-23 使用Python腳本提取基因組指定位置序列_python
- 2022-04-14 CMake編譯中的庫文件和頭文件鏈接你了解嗎_C 語言
- 2022-04-12 C語言三分鐘精通時間復雜度與空間復雜度_C 語言
- 2022-11-16 python3?如何解壓縮.gz文件_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同步修改后的遠程分支