深入理解基本數據結構:鏈表詳解

引言

在計算機科學中,數據結構是存儲、組織和管理數據的方式。鏈表是一種重要的線性數據結構,廣泛應用于各種編程場景。在這篇博客中,我們將詳細探討鏈表的定義、特點、操作及其在不同編程語言中的實現。


什么是鏈表?

鏈表是一種線性數據結構,由一系列節點組成,每個節點包含數據和指向下一個節點的指針。鏈表的特點是節點在內存中不一定是連續存儲的。

鏈表的特點

  1. 動態大小:鏈表可以根據需要動態調整大小。
  2. 插入和刪除操作高效:在鏈表中插入和刪除元素非常高效,只需調整指針即可。
  3. 不連續存儲:鏈表的節點在內存中可以是不連續存儲的。
  4. 隨機訪問不方便:鏈表不支持通過索引隨機訪問元素,需要從頭節點開始遍歷。

鏈表的基本類型

單向鏈表

單向鏈表的每個節點包含一個數據域和一個指向下一個節點的指針。

head
節點1
節點2
節點3
節點4
null

雙向鏈表

雙向鏈表的每個節點包含一個數據域,一個指向下一個節點的指針和一個指向前一個節點的指針。

null
節點1
節點2
節點3
節點4
null

循環鏈表

循環鏈表的最后一個節點的指針指向頭節點,形成一個環。

head
節點1
節點2
節點3
節點4

鏈表的基本操作

創建鏈表

Java中創建鏈表
class Node {int data;Node next;Node(int data) {this.data = data;this.next = null;}
}public class LinkedList {Node head;// 添加節點到鏈表末尾public void add(int data) {Node newNode = new Node(data);if (head == null) {head = newNode;} else {Node current = head;while (current.next != null) {current = current.next;}current.next = newNode;}}// 輸出鏈表中的所有節點public void printList() {Node current = head;while (current != null) {System.out.print(current.data + " ");current = current.next;}}public static void main(String[] args) {LinkedList list = new LinkedList();list.add(1);list.add(2);list.add(3);list.add(4);list.printList();}
}

插入節點

Java中插入節點
public class LinkedList {Node head;// 在鏈表開頭插入節點public void insertAtBeginning(int data) {Node newNode = new Node(data);newNode.next = head;head = newNode;}// 在鏈表末尾插入節點public void add(int data) {Node newNode = new Node(data);if (head == null) {head = newNode;} else {Node current = head;while (current.next != null) {current = current.next;}current.next = newNode;}}// 輸出鏈表中的所有節點public void printList() {Node current = head;while (current != null) {System.out.print(current.data + " ");current = current.next;}}public static void main(String[] args) {LinkedList list = new LinkedList();list.insertAtBeginning(1);list.add(2);list.add(3);list.add(4);list.printList();}
}

刪除節點

Java中刪除節點
public class LinkedList {Node head;// 刪除鏈表中的第一個節點public void deleteFirst() {if (head != null) {head = head.next;}}// 刪除鏈表中的最后一個節點public void deleteLast() {if (head == null || head.next == null) {head = null;return;}Node current = head;while (current.next.next != null) {current = current.next;}current.next = null;}// 輸出鏈表中的所有節點public void printList() {Node current = head;while (current != null) {System.out.print(current.data + " ");current = current.next;}}public static void main(String[] args) {LinkedList list = new LinkedList();list.add(1);list.add(2);list.add(3);list.add(4);list.printList();System.out.println();list.deleteFirst();list.printList();System.out.println();list.deleteLast();list.printList();}
}

查找節點

Java中查找節點
public class LinkedList {Node head;// 查找鏈表中的節點public boolean search(int key) {Node current = head;while (current != null) {if (current.data == key) {return true;}current = current.next;}return false;}// 添加節點到鏈表末尾public void add(int data) {Node newNode = new Node(data);if (head == null) {head = newNode;} else {Node current = head;while (current.next != null) {current = current.next;}current.next = newNode;}}// 輸出鏈表中的所有節點public void printList() {Node current = head;while (current != null) {System.out.print(current.data + " ");current = current.next;}}public static void main(String[] args) {LinkedList list = new LinkedList();list.add(1);list.add(2);list.add(3);list.add(4);list.printList();System.out.println();System.out.println("查找2: " + list.search(2));System.out.println("查找5: " + list.search(5));}
}

圖解:鏈表的基本操作

創建鏈表
創建鏈表
創建頭節點
節點1
節點2
節點3
null
插入節點
插入節點
創建新節點
調整指針
新節點插入完成
刪除節點
刪除節點
找到要刪除的節點
調整指針
節點刪除完成
查找節點
查找節點
從頭節點開始遍歷
檢查當前節點
找到目標節點
繼續遍歷
未找到目標節點

總結

鏈表作為一種重要的數據結構,具有動態大小插入和刪除操作高效不連續存儲隨機訪問不方便的特點。通過對鏈表的基本操作和實現的學習,我們可以更好地理解和使用鏈表。在實際編程中,鏈表的應用廣泛且靈活,是每個程序員都必須掌握的基礎知識。


參考資料

  1. Java LinkedList Documentation
  2. Python List Documentation
  3. JavaScript Array Documentation

希望這篇博客能幫助你更好地理解鏈表。如果你喜歡這篇文章,請給我點贊,并點擊關注,以便第一時間獲取更多優質內容!謝謝你的支持!


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

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

相關文章

Mobile ALOHA前傳之VINN, Diffusion Policy和ACT對比

VINNDiffusion PolicyACT核心思想1.從離線數據中自監督學習獲得一個視覺編碼器;2.基于視覺編碼器,從采集的示例操作數據中檢索與當前觀測圖像最相似的N張圖像以及對應的動作;3.基于圖像編碼器的距離對各個動作進行加權平均,獲得最…

Open3D loss函數優化的ICP配準算法(精配準)

目錄 一、概述 1.1ICP的基本步驟 1.2損失函數的設計 二、代碼實現 2.1關鍵函數 2.2完整代碼 三、實現效果 3.1原始點云 3.2配準后點云 3.3計算數據 一、概述 ICP(Iterative Closest Point)配準算法是一種用于對齊兩個點云的經典算法。其目標是通過迭代優化…

Istio實戰教程:Service Mesh部署與流量管理

引言 Istio是一個開源的服務網格,它提供了一種統一的方法來連接、保護、控制和觀察服務。本教程將指導你從零開始部署Istio,并展示如何使用Istio進行基本的流量管理。 環境準備 Kubernetes集群:Istio運行在Kubernetes之上,確保…

W25Q64 Flash存儲器與STM32:硬件與軟件的完美結合案例

摘要 在嵌入式系統中,數據存儲是關鍵組成部分之一。W25Q64 Flash存儲器因其高容量、低功耗和高可靠性,成為STM32微控制器項目中優選的存儲解決方案。本文將展示W25Q64與STM32微控制器集成的案例,包括硬件設計、SPI通信協議實現和軟件編程策略…

記錄在Windows上安裝Docker

在Windows上安裝Docker時,可以選擇使用不同的后端。 其中兩個常見的選擇是:WSL 2(Windows Subsystem for Linux 2)和 Hyper-V 后端。此外,還可以選擇使用Windows容器。 三者的區別了解即可,推薦用WSL 2&…

我們公司落地大模型的路徑、方法和坑

我們公司落地大模型的路徑、方法和坑 李木子 AI大模型實驗室 2024年07月02日 18:35 北京 最近一年,LLM(大型語言模型)已經成熟到可以投入實際應用中了。預計到 2025 年,AI 領域的投資會飆升到 2000 億美元。現在,不只…

Thinking--在應用中添加動態水印,且不可刪除

Thinking系列,旨在利用10分鐘的時間傳達一種可落地的編程思想。 水印是一種用于保護版權和識別內容的技術,通常用于圖像、視頻或文檔中。它可以是文本、圖像或兩者的組合,通常半透明或以某種方式嵌入到內容中,使其不易被移除或篡改…

【Linux】多線程_2

文章目錄 九、多線程2. 線程的控制 未完待續 九、多線程 2. 線程的控制 主線程退出 等同于 進程退出 等同于 所有線程都退出。為了避免主線程退出,但是新線程并沒有執行完自己的任務的問題,主線程同樣要跟進程一樣等待新線程返回。 pthread_join 函數…

【代碼隨想錄_Day28】62. 不同路徑 63. 不同路徑 II

Day28 OK,今日份的打卡!第二十八天 以下是今日份的總結不同路徑不同路徑 II 以下是今日份的總結 62 不同路徑 63 不同路徑 II 今天的題目難度不低,盡量還是寫一些簡潔代碼 ^?_?^ 不同路徑 思路: 1.確定dp數組(dp…

算法學習筆記(8.2)-動態規劃入門進階

目錄 問題判斷: 問題求解步驟: 圖例: 解析: 方法一:暴力搜索 實現代碼如下所示: 解析: 方法二:記憶化搜索 代碼示例: 解析: 方法三:動態規劃 空間…

每日復盤-20240709

今日關注: 20240709 六日漲幅最大: ------1--------300391--------- 長藥控股 五日漲幅最大: ------1--------300391--------- 長藥控股 四日漲幅最大: ------1--------603155--------- 新亞強 三日漲幅最大: ------1--------301300--------- 遠翔新材 二日漲幅最大: ------1-…

基于antdesign封裝一個react的上傳組件

項目中遇到了一個上傳的需求,看了一下已有的代碼很粗糙,而且是直接引用andt的組件,體驗不太好,自己使用FormData對象封裝了一個上傳組件,僅供參考。 代碼如下: /*** FileUploadModal* description - 文件選…

Qt入門(二):Qt的基本組件

目錄 Designer程序面板 1、布局Layout 打破布局 貼合窗口 2、QWidget的屬性 3、Qlabel標簽 顯示圖片 4、QAbstractButton 按鈕類 按鈕組 5、QLineEdit 單行文本輸入框 6、ComboBox 組合框 7、若干與數字相關的組件 Designer程序面板 Qt包含了一個Designer程序 &…

Qt編程技巧總結篇(3)-信號-槽-多線程(二)

文章目錄 Qt編程技巧總結篇(3)-信號-槽-多線程(二)主進程與子線程線程同步實例與應用 小結 Qt編程技巧總結篇(3)-信號-槽-多線程(二) 多線程學習,使用QMutex,…

RTK_ROS_導航(3):點云的壓縮,PointCloud轉scan

目錄 1. 源碼的安裝2. 修改訂閱的話題3. 可視化1. 源碼的安裝 安裝過程如下 mkdir -p point_to_scan_ws/src cd point_to_scan_ws/src git clone https://github.com/BluewhaleRobot/pointcloud_to_laserscan.git cd .. catkin_make source devel/setup.bash2. 修改訂閱的話題 …

2024.07.01校招 實習 內推 面經

綠*泡*泡VX: neituijunsir 交流*裙 ,內推/實習/校招匯總表格 1、校招 | 元戎啟行2025校園招聘正式批正式啟動(內推) 校招 | 元戎啟行2025校園招聘正式批正式啟動(內推) 2、提前批 | 多益網絡2025屆校園…

基于抽象 HandlerInterceptor 快速實現接口鑒權

歡迎關注公眾號:冬瓜白 相關文章: 每天學習一點點之 Spring Web MVC 之抽象 HandlerInterceptor 快速實現常用功能(限流、權限等) 在[每天學習一點點之 Spring Web MVC 之抽象 HandlerInterceptor 快速實現常用功能&#xff08…

Numpy的廣播機制(用于自動處理不同形狀的數組)

NumPy 廣播是一種強大的機制,允許 NumPy 在執行元素級運算時自動處理不同形狀的數組。廣播的規則使得無需顯式地創建匹配形狀的數組,直接進行運算,大大簡化了代碼并提高了效率。 基本概念 廣播的基本思想是讓較小的數組在需要的維度上進行擴…

【MySQL數據庫之概念性問題】

1、關系型數據庫和非關系型數據庫 關系型數據庫(Relational Database,簡稱RDBMS)和非關系型數據庫(NoSQL Database)是兩種不同的數據庫類型。SQL本身叫做結構化查詢語言1、關系型數據庫:(MySQL…

Django 更新數據 save()方法

1,添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharFie…