Python----數據結構(單鏈表:節點,是否為空,長度,遍歷,添加,刪除,查找)

一、鏈表

????????鏈表是一種線性數據結構,由一系列按特定順序排列的節點組成,這些節點通過指針相互連接。每個節點包含兩部分:元素和指向下一個節點的指針。其中,最簡單的形式是單向鏈表,每個節點含有一個信息域和一個指針域,該指針指向鏈表中的下一個節點,最后一個節點則指向一個空值。

1.1、Python中的鏈表

?????????大部分都是用C語言實現鏈表,因為C有指針,可以很方便的控制內存,很輕易就可以實現鏈 表,在C/C++中,通常采用“指針+結構體”來實現鏈表。

?????????Python是一門動態語言,可以直接把對象賦值給新的變量,我們采用“引用+類”來實現 鏈表。

?????????結構:data為自定義的數據,next為下一個節點的地址。

?????????鏈表的種類:單向鏈表、雙向鏈表、單向循環鏈表、雙向循環鏈表。?

1.2、基本元素

節點:每個節點有兩個部分,左邊稱為值域,存放用戶數據;右邊部分稱為指針域,用來存 放指向下一個元素的指針。

Head:head節點永遠指向第一個節點。

Tail:tail節點永遠指向最后一個節點。

None:鏈表中最后一個節點的指針域為None。

二、基本操作

2.1、節點的創建

class Node:def __init__(self, data):# 初始化節點,包含數據和指向下一個節點的指針self.data = dataself.next = None  

2.2、初始化單向鏈表

class LinkList:def __init__(self, node=None):# 初始化鏈表,頭指針指向第一個節點(默認為None)self.__head = node

2.3、判斷是否為空

    def is_empty(self):# 檢查鏈表是否為空return self.__head == None

2.4、鏈表長度

    def length(self):# 計算鏈表的長度current = self.__headcount = 0while current != None:count += 1current = current.nextreturn count

2.5、遍歷鏈表?

    def travel(self):# 遍歷鏈表并打印每個節點的數據current = self.__headwhile current != None:print(current.data)current = current.next

2.4、插入節點

2.4.1、頭節點

    def add(self, data):# 在鏈表頭部添加新節點new_node = Node(data)new_node.next = self.__headself.__head = new_node

2.4.2、中間節點

    def insert(self, pos, data):# 在指定位置插入新節點if pos > self.length() - 1:self.append(data)  # 如果位置超出范圍,添加到尾部elif pos <= 0:self.add(data)  # 如果位置小于等于0,添加到頭部else:new_node = Node(data)pre = self.__headcount = 0while count < pos - 1:count += 1pre = pre.nextnew_node.next = pre.next  # 將新節點的next指向當前節點的nextpre.next = new_node  # 將前一個節點的next指向新節點

2.4.3、尾節點

    def append(self, data):# 在鏈表尾部添加新節點new_node = Node(data)if self.is_empty():self.__head = new_nodeelse:current = self.__headwhile current.next != None:current = current.nextcurrent.next = new_node

?

2.5、刪除節點

    def remove(self, data):# 移除鏈表中指定數據的節點current = self.__headpre = Nonewhile current != None:if current.data == data:if current == self.__head:self.__head = current.next  # 如果是頭節點,更新頭指針else:pre.next = current.next  # 將前一個節點的next指向當前節點的nextbreakelse:pre = currentcurrent = current.next

2.6、查找節點

    def serch(self, data):# 查找鏈表中是否存在指定數據current = self.__headwhile current != None:if current.data == data:return True  # 找到數據,返回Trueelse:current = current.nextreturn False  # 遍歷完成未找到數據,返回False

三、鏈表的特點

1、動態數據集合:鏈表允許動態的添加和刪除元素,這使得它們在處理未知數量或頻繁變 化的數據集時非常有用。

2、元素順序:鏈表可以按照插入順序來保持元素的順序,這對于需要維護元素插入順序的 應用程序非常有用。

3、 內存效率:與數組相比,鏈表在內存使用上更為高效,因為它們不需要連續的內存空間。 鏈表通過節點之間的指針來連接元素,這樣可以更有效地利用內存空間。

4、避免數組擴容:數組在初始化時需要指定大小,如果超出大小,則需要擴容,這是一個 昂貴的操作。鏈表則可以避免這個問題,因為它們可以動態地增長。

四、單向鏈表的缺點

1、只能從頭遍歷到尾或者從尾遍歷到頭(一般從頭到尾)。

2、鏈表相連的過程是單向的。實現的原理是上一個鏈表中有一個指向下一個的引用。

3、?我們可以輕松的到達下一個節點, 但是回到前一個節點是很難的。但是, 在實際開發中, 經 常會遇到需要回到上一個節點的情況。

舉個例子:

????????假設一個文本編輯用鏈表來存儲文本。每一行用一個String對象存儲在鏈表的 一個節點中。當編輯器用戶向下移動光標時, 鏈表直接操作到下一個節點即可。但是當用 于將光標向上移動呢? 這個時候為了回到上一個節點, 我們可能需要從頭開始, 依次走到 想要的節點上。

五、完整代碼?

class Node:def __init__(self, data):# 初始化節點,包含數據和指向下一個節點的指針self.data = dataself.next = Noneclass LinkList:def __init__(self, node=None):# 初始化鏈表,頭指針指向第一個節點(默認為None)self.__head = nodedef is_empty(self):# 檢查鏈表是否為空return self.__head == Nonedef length(self):# 計算鏈表的長度current = self.__headcount = 0while current != None:count += 1current = current.nextreturn countdef travel(self):# 遍歷鏈表并打印每個節點的數據current = self.__headwhile current != None:print(current.data)current = current.nextdef add(self, data):# 在鏈表頭部添加新節點new_node = Node(data)new_node.next = self.__headself.__head = new_nodedef append(self, data):# 在鏈表尾部添加新節點new_node = Node(data)if self.is_empty():self.__head = new_nodeelse:current = self.__headwhile current.next != None:current = current.nextcurrent.next = new_nodedef insert(self, pos, data):# 在指定位置插入新節點if pos > self.length() - 1:self.append(data)  # 如果位置超出范圍,添加到尾部elif pos <= 0:self.add(data)  # 如果位置小于等于0,添加到頭部else:new_node = Node(data)pre = self.__headcount = 0while count < pos - 1:count += 1pre = pre.nextnew_node.next = pre.next  # 將新節點的next指向當前節點的nextpre.next = new_node  # 將前一個節點的next指向新節點def remove(self, data):# 移除鏈表中指定數據的節點current = self.__headpre = Nonewhile current != None:if current.data == data:if current == self.__head:self.__head = current.next  # 如果是頭節點,更新頭指針else:pre.next = current.next  # 將前一個節點的next指向當前節點的nextbreakelse:pre = currentcurrent = current.nextdef serch(self, data):# 查找鏈表中是否存在指定數據current = self.__headwhile current != None:if current.data == data:return True  # 找到數據,返回Trueelse:current = current.nextreturn False  # 遍歷完成未找到數據,返回Falseif __name__ == '__main__':linklist = LinkList()linklist.add(10)  # 添加節點10linklist.add(20)  # 添加節點20linklist.append(100)  # 在尾部添加節點100linklist.add(30)  # 添加節點30linklist.add(40)  # 添加節點40print(linklist.is_empty())  # 檢查鏈表是否為空print(linklist.length())  # 輸出鏈表長度print('*****************')linklist.remove(30)  # 移除節點30# linklist.travel()  # 遍歷鏈表并打印節點數據print(linklist.serch(40))  # 查找節點40是否存在# linklist.travel()  # 遍歷鏈表并打印節點數據

六、思維導圖?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70287.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70287.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70287.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

夜鶯監控發布 v8.beta5 版本,優化 UI,新增接口認證方式便于鑒權

以防讀者不了解夜鶯&#xff0c;開頭先做個介紹&#xff1a; 夜鶯監控&#xff0c;英文名字 Nightingale&#xff0c;是一款側重告警的監控類開源項目。類似 Grafana 的數據源集成方式&#xff0c;夜鶯也是對接多種既有的數據源&#xff0c;不過 Grafana 側重在可視化&#xff…

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量數據庫? 怎么使用

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量數據庫? 怎么使用 目錄 什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量數據庫? 怎么使用Embedding(嵌入)RAG(檢索增強生成)Function calling(函數調用)Pr…

SQLMesh 系列教程5- 詳解SQL模型

本文將詳細介紹 SQLMesh 的 SQL 模型組成要素及其在實際項目中的應用。SQLMesh 是一個強大的數據工程工具&#xff0c;其 SQL 模型由 MODEL DDL、預處理語句、主查詢、后處理語句以及可選的 ON VIRTUAL UPDATE 語句組成。我們將通過一個電商平臺每日銷售報告的實例&#xff0c;…

DeepSeek 接入PyCharm實現AI編程!(支持本地部署DeepSeek及官方DeepSeek接入)

前言 在當今數字化時代&#xff0c;AI編程助手已成為提升開發效率的利器。DeepSeek作為一款強大的AI模型&#xff0c;憑借其出色的性能和開源免費的優勢&#xff0c;成為許多開發者的首選。今天&#xff0c;就讓我們一起探索如何將DeepSeek接入PyCharm&#xff0c;實現高效、智…

從駕駛員到智能駕駛:汽車智能化進程中的控制與仿真技術

在汽車技術持續演進的歷程中&#xff0c;人類駕駛員始終是一個極具研究價值的智能控制系統“原型”。駕駛員通過視覺感知、行為決策與操作執行的閉環控制&#xff0c;將復雜的駕駛任務轉化為車輛的實際動作&#xff0c;同時動態適應道路環境的變化。這一過程不僅體現了高度的自…

Spring Boot項目的基本設計步驟和相關要點介紹

以下是一個關于Spring Boot項目的基本設計步驟和相關要點介紹,我們以一個簡單的示例應用——員工管理系統為例進行說明: 一、項目概述 員工管理系統旨在實現對公司員工信息的有效管理,包括員工基本信息錄入、查詢、更新以及刪除等功能。通過Spring Boot框架來快速搭建后端…

【Java】泛型與集合篇(一)

泛型與集合(一) 泛型泛型的核心作用泛型類型(類)定義與使用類型參數命名約定泛型方法定義與調用與泛型類的區別通配符上界通配符下界通配符有界類型參數類型擦除集合框架核心接口Collection 接口Map 接口Collection 接口操作的常用方法基本操作批量操作數組操作流操作方法L…

HarmonyOS組件之Tabs

Tabs 1.1概念 Tabs 視圖切換容器&#xff0c;通過相適應的頁簽進行視圖頁面的切換的容器組件每一個頁簽對應一個內容視圖Tabs擁有一種唯一的子集元素TabContent 1.2子組件 不支持自定義組件為子組件&#xff0c;僅可包含子組件TabContent&#xff0c;以及渲染控制類型 if/e…

華為FusionCompute虛擬化平臺

一、華為FusionCompute虛擬化套件介紹 華為FusionCompute虛擬化套件是業界領先的虛擬化解決方案&#xff0c;能夠幫助客戶帶來如下的價值&#xff0c;從而大幅提升數據中心基礎設施的效率。 幫助客戶提升數據中心基礎設施的資源利用率&#xff1b;幫助客戶成倍縮短業務上線周期…

使用apt-rdepends制作軟件離線deb安裝包

使用apt-rdepends制作軟件離線deb安裝包 除基礎軟件外&#xff0c;還要獲取軟件依賴包。 依賴包工具安裝 apt-get install apt-rdependsapt-rdepends工具使用 使用apt-rdepends工具&#xff0c;遞歸方式分析軟件依賴&#xff0c;下載軟件包本體&#xff0c;和依賴包。制作時…

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析⑩】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase10 作者&#xff1a;車端域控測試工程師 更新日期&#xff1a;2025年02月18日 關鍵詞&#xff1a;UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-010測試用例 用例ID測試場景驗證要點參考條款預期結果TC…

什么是Scaling Laws(縮放定律);DeepSeek的Scaling Laws

什么是Scaling Laws(縮放定律) Scaling Laws(縮放定律)在人工智能尤其是深度學習領域具有重要意義,以下是相關介紹及示例: 定義與內涵 Scaling Laws主要描述了深度學習模型在規模(如模型參數數量、訓練數據量、計算資源等)不斷擴大時,模型性能與這些規模因素之間的…

大一計算機的自學總結:前綴樹(字典樹、Trie樹)

前言 前綴樹&#xff0c;又稱字典樹&#xff0c;Trie樹&#xff0c;是一種方便查找前綴信息的數據結構。 一、字典樹的實現 1.類描述實現 #include <bits/stdc.h> using namespace std;class TrieNode { public:int pass0;int end0;TrieNode* nexts[26]{NULL}; };Tri…

【存儲中間件API】MySQL、Redis、MongoDB、ES常見api操作及性能比較

常見中間件api操作及性能比較 ?? MySQL crud操作?? maven依賴?? 配置?? 定義實體類?? 常用api ?? Redis crud操作?? maven依賴?? 配置?? 常用api ?? MongoDB crud操作?? maven依賴?? 配置文件?? 定義實體類?? MongoDB常用api ?? ES crud操作 ??…

51單片機入門_10_數碼管動態顯示(數字的使用;簡單動態顯示;指定值的數碼管動態顯示)

接上篇的數碼管靜態顯示&#xff0c;以下是接上篇介紹到的動態顯示的原理。 動態顯示的特點是將所有位數碼管的段選線并聯在一起&#xff0c;由位選線控制是哪一位數碼管有效。選亮數碼管采用動態掃描顯示。所謂動態掃描顯示即輪流向各位數碼管送出字形碼和相應的位選&#xff…

C++入門《類和對象》之《運算符重載》詳解|成員函數重載/非成員函數重載

C 中&#xff0c;運算符重載是一種特殊的函數&#xff0c;它允許程序員為自定義的數據類型&#xff08;如類和結構體&#xff09;重新定義運算符的行為&#xff0c;使得這些運算符能夠像處理內置數據類型一樣處理自定義類型的數據。下面將從多個方面詳細講解 C 里的運算符重載。…

Salesforce 檢索Layout的設定

做了許多Object&#xff0c;卻想不起來怎么設置我的Listview的項目了。 問題&#xff1a; salesforce 最近參照したオブジェクト 表示項目を変更したいですが、「検索レイアウト」の選択メニューが該當オブジェクトのオブジェクトマネージャーから出てないです。 解決方法&am…

SECS/GEM300應用案例參考

GEM300 是一種用于半導體制造領域的通信協議標準&#xff0c;主要用于支持 300mm 晶圓制造的自動化生產。以下是 GEM300 的一些具體應用案例&#xff1a; 1. 半導體設備集成 設備制造商的應用&#xff1a;廣州金南瓜科技有限公司通過 GEM300 SDK&#xff0c;幫助國內多個半導體…

win10系統上的虛擬機安裝麒麟V10系統提示找不到操作系統

目錄預覽 一、問題描述二、原因分析三、解決方案四、參考鏈接 一、問題描述 win10系統上的虛擬機安裝麒麟V10系統提示找不到操作系統&#xff0c;報錯&#xff1a;Operating System not found 二、原因分析 國產系統&#xff0c;需要注意的點&#xff1a; 需要看你的系統類…

情書網源碼 情書大全帝國cms7.5模板

源碼介紹 帝國cms7.5仿《情書網》模板源碼&#xff0c;同步生成帶手機站帶采集。適合改改做文學類的網站。 效果預覽 源碼獲取 情書網源碼 情書大全帝國cms7.5模板