數據結構學習筆記 :線性表的鏈式存儲詳解

目錄

  1. 單鏈表
    1.1 無頭單鏈表
    1.2 有頭單鏈表
  2. 單向循環鏈表
  3. 雙鏈表
    3.1 雙鏈表
    3.2 雙向循環鏈表
  4. 總結與對比

一、單鏈表

1. 無頭單鏈表(Headless Singly Linked List)

定義:鏈表無頭結點,直接由頭指針指向第一個數據節點。

特點

  • 插入/刪除第一個節點需特殊處理。
  • 空鏈表時頭指針為NULL
核心代碼
typedef struct LNode {int data;struct LNode *next;
} LNode, *LinkList;bool InitList(LinkList *L) {*L = NULL;return true;
}bool insert_head(LinkList *L, LNode *new) {if (new == NULL) return false;new->next = *L;*L = new;return true;
}

示例操作
int main() {LinkList list;InitList(&list);LNode *node = newnode(11);insert_head(&list, node); // 頭部插入// ... 其他操作return 0;
}


2. 有頭單鏈表(Singly Linked List with Header)

定義:鏈表包含頭結點,頭指針始終指向頭結點。

優點

  • 插入/刪除第一個節點與普通節點操作統一。
  • 空鏈表時頭指針不為NULL,統一處理邏輯。
核心代碼
bool InitList(LinkList *L) {*L = (LNode*)malloc(sizeof(LNode));(*L)->next = NULL;return true;
}bool insert_head(LinkList L, LNode *new) {new->next = L->next;L->next = new;return true;
}bool insert_tail(LinkList L, LNode *new) {LNode *p = L;while (p->next != NULL) p = p->next;p->next = new;return true;
}

示例操作
int main() {LinkList list;InitList(&list);LNode *node = newnode(11);insert_head(list, node); // 頭部插入node = newnode(88);insert_tail(list, node); // 尾部插入// ... 其他操作return 0;
}


二、單向循環鏈表(Circular Linked List)

定義:鏈表最后一個節點的next指向頭結點,形成循環。

特點

  • 支持從任意節點開始遍歷整個鏈表。
  • 刪除操作需注意頭結點的特殊處理。
核心代碼
bool InitList(DLinkList *L) {*L = (LNode*)malloc(sizeof(LNode));(*L)->next = *L;return true;
}bool insert_head(LinkList L, LNode *new) {new->next = L->next;L->next = new;return true;
}LNode* delete_tail(LinkList L) {LNode *p = L, *q = L->next;while (q->next != L) {p = q;q = q->next;}p->next = L;return q;
}


三、雙鏈表(Doubly Linked List)

1. 雙鏈表

定義:每個節點包含prevnext指針,支持雙向遍歷。

特點

  • 可高效實現插入/刪除操作(需同時維護前后指針)。
  • 需額外存儲空間。
核心代碼
typedef struct DNode {int data;struct DNode *prev, *next;
} DNode, *DLinkList;bool insert_head(DLinkList L, DNode *new) {new->next = L->next;new->prev = L;if (L->next != NULL) L->next->prev = new;L->next = new;return true;
}DNode* delete(DLinkList L, DNode *node) {if (node == L) return NULL;node->prev->next = node->next;if (node->next != NULL) node->next->prev = node->prev;return node;
}


2. 雙向循環鏈表(Circular Doubly Linked List)

定義:雙鏈表最后一個節點的next指向頭結點,頭結點的prev指向尾節點。

特點

  • 支持高效雙向遍歷和循環操作。
  • 操作需處理循環指針。
核心代碼
bool InitList(DLinkList *L) {*L = (DNode*)malloc(sizeof(DNode));(*L)->next = *L;(*L)->prev = *L;return true;
}bool insert_head(DLinkList L, DNode *new) {new->next = L->next;new->prev = L;L->next->prev = new;L->next = new;return true;
}DNode* delete_tail(DLinkList L) {DNode *p = L->prev;p->prev->next = L;L->prev = p->prev;return p;
}


四、總結與對比

結構類型插入/刪除時間復雜度優點缺點
無頭單鏈表O(n)簡單頭部操作需特殊處理
有頭單鏈表O(1)(頭插)操作統一需額外頭結點空間
單向循環鏈表O(1)(頭插)支持循環遍歷需處理循環指針
雙鏈表O(1)(雙向操作)支持雙向遍歷空間占用更大
雙向循環鏈表O(1)(雙向操作)完全循環遍歷實現復雜度最高

關鍵點總結

  1. 頭結點的作用:統一操作邏輯,避免空指針問題。
  2. 循環鏈表的優勢:遍歷無需判斷尾節點,適合需要循環遍歷的場景。
  3. 雙鏈表的適用場景:需要頻繁雙向遍歷或快速刪除節點的場景(如瀏覽器歷史記錄)。

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

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

相關文章

數據庫10(代碼相關語句)

while循環 declare avgprice numeric(10,2) set avgprice(select avg(price)from titles) //自定義參數 while avgprice<10 //循環條件 begin update titles set priceprice*1.1 end //循環語句操作&#xff0c;當avgprice<10,所有price都加0.1 case語句 查詢authors表…

Redis 下載與安裝(Windows版)

一、下載 1、redis官網&#xff1a; https://redis.io/downloads/ 2、Github下載地址&#xff1a; https://github.com/MicrosoftArchive/redis/releases 二、安裝 1、打開一個命令窗口&#xff0c;通過 cd 命令進入到你解壓的目錄 2、輸入命令 &#xff0c;啟動 Redis&…

在高數據速度下確保信號完整性的 10 個關鍵策略

隨著越來越多的傳感器連接到系統&#xff0c;需要快速、可靠和安全地傳輸更多數據&#xff0c;對帶寬和設計復雜性的需求也在增加。優先考慮的是確保從 A 發送到 B 的信號不會失真。 確保信號完整性 對于設計依賴于持續準確數據流的數據密集型應用程序的工程師來說&#xff0c…

NAT、代理服務、內網穿透

NAT、代理服務、內網穿透 1、NAT1.1、NAT過程1.2、NAPT2、內網穿透3、內網打洞3、代理服務器3.1、正向代理3.2、反向代理1、NAT 1.1、NAT過程 之前我們討論了IPv4協議中IP地址數量不充足的問題。NAT技術是當前解決IP地址不夠用的主要手段,是路由器的一個重要功能。 NAT能夠將…

利用互斥鎖或者利用邏輯過期解決緩存擊穿問題

緩存擊穿問題概述 緩存擊穿是指某個 熱點數據緩存過期 時&#xff0c;大量并發請求直接穿透緩存&#xff0c;同時訪問數據庫&#xff0c;導致數據庫壓力驟增甚至崩潰。以下是基于 互斥鎖 和 邏輯過期 的解決方案&#xff1a; 一、緩存擊穿的核心原因 熱點數據失效&#xff1a…

Vue3組合式API內核解析:從原子狀態到企業級架構

一、組合邏輯原子化設計 1.1 狀態管理層級拓撲 1.2 組合單元類型對照表 類型典型實現適用場景復用維度UI邏輯單元useForm/useTable表單/列表交互100%跨項目復用業務邏輯單元useOrderFlow訂單流程控制同項目跨模塊設備能力單元useGeolocation地理位置獲取跨技術棧復用狀態管理…

新生宿舍管理系統

收藏關注不迷路&#xff01;&#xff01; &#x1f31f;文末獲取源碼數據庫&#x1f31f; 感興趣的可以先收藏起來&#xff0c;還有大家在畢設選題&#xff08;免費咨詢指導選題&#xff09;&#xff0c;項目以及論文編寫等相關問題都可以給我留言咨詢&#xff0c;希望幫助更多…

從零上手GUI Guider學習LVGL——Button

視頻教程請關注我b站&#xff1a;同學_好好學習&#xff0c;這里只是做相應的筆記文稿 從零上手GUI Guider學習LVGL——Buttton 前言&#xff1a; 首先我們為什么要學習LVGL設計工具呢&#xff1f; 1 降低開發難度 2 提高開發效率 所以我們需要學習一款合適的設計工具 在b站很少…

【AAOS】【源碼分析】Car UX Restrictions

AAOS UX的核心理念:安全駕駛是駕駛員的首要責任。汽車制造商和應用程序開發人員的所有設計都必須反映這一優先事項。 AAOS平臺允許設備制造商(OEM)對不同駕駛狀態下的限制進行定制。 駕駛員分心指南 只有符合Driver Distraction Guidelines的應用才可以在駕駛過程中運行。…

jvm調優工具arthas(阿爾薩斯)安裝與使用---實踐

jvm調優工具arthas(阿爾薩斯)安裝與使用—實踐 Arthas 是Alibaba開源的Java診斷工具&#xff0c;深受開發者喜愛。 當你遇到以下類似問題而束手無策時&#xff0c;Arthas可以幫助你解決&#xff1a; 這個類從哪個 jar 包加載的&#xff1f;為什么會報各種類相關的 Exception…

機器學習期末

選擇題 以下哪項不是機器學習的類型&#xff1f; A. 監督學習 B.無監督學習 C.半監督學習 D.全監督學習 D 哪一個是機器學習的合理定義? A、機器學習是計算機編程的科學 B、機器學習從標記的數據中學習 C、機器學習是允許機器人智能行動的領域 D、機器學習能使計算機能夠在…

3DMAX粒子流樣條線生成器PFSpliner使用方法詳解

3DMAX粒子流樣條線生成器&#xff0c;是一款功能強大且富有創意的工具。它能夠為“粒子流源”的每一個粒子生成專屬的動畫樣條線&#xff0c;這些樣條線描繪出粒子在空間中的運動軌跡&#xff0c;就如同為粒子繪制出了一條條獨特的“運動地圖”。更為出色的是&#xff0c;這些樣…

Maven中clean、compil等操作介紹和Pom.xml中各個標簽介紹

文章目錄 前言Maven常用命令1.clean2.vaildate3.compile4.test5.package6.verify7.install8.site9.deploy pom.xml標簽詳解格式<?xml version"1.0" encoding"UTF-8"?>(xml版本和編碼)modelVersion&#xff08;xml版本&#xff09;groupId&#xff…

Centos7.6安裝JDK 1.8教程

前提&#xff1a;先把jdk1.8文件上傳到usr/local目錄下&#xff0c;文件名如&#xff1a;jdk-8u151-linux-x64.tar.gz 1. 解壓 JDK 壓縮包 假設 jdk-8u151-linux-x64.tar.gz 文件位于 /usr/local 目錄下。 進入 /usr/local 目錄&#xff1a; cd /usr/local 解壓文件&#…

EuroCropsML:首個面向少樣本時間序列作物分類的多國基準數據集

2025-04-15&#xff0c;由慕尼黑工業大學等機構創建的 EuroCropsML 數據集&#xff0c;這是一個結合了農民報告的作物數據與 Sentinel-2 衛星觀測的時間序列數據集&#xff0c;覆蓋了愛沙尼亞、拉脫維亞和葡萄牙。該數據集為解決遙感應用中作物類型數據空間不平衡問題提供了新的…

將python項目打包成Windows后臺服務

前文,我開發了一個基于windows11與本地deepseek實現的語音助手,之前是通過CMD直接執行項目的main.py文件。但是這樣不適合移植,現在想將其生成一個exe文件,以及部署成windows的后臺服務。 關于語音助手的開發與發布,可以看的CSDN文章:一個基于windows11與本地deepseek實…

yolov8復現

Yolov8的復現流程主要包含環境配置、下載源碼和驗證環境三大步驟&#xff1a; 環境配置 查看電腦狀況&#xff1a;通過任務管理器查看電腦是否有獨立顯卡&#xff08;NVIDIA卡&#xff09;。若有&#xff0c;后續可安裝GPU版本的pytorch以加速訓練&#xff1b;若沒有&#xff0…

Yocto項目實戰教程 · 第4章:4.1小節元數據

&#x1f50d; B站相應的視頻教程&#xff1a; &#x1f4cc; Yocto項目實戰教程-第4章-4.1小節-元數據 記得三連&#xff0c;標為原始粉絲。 在嵌入式Linux系統構建中&#xff0c;Yocto項目憑借其高度模塊化、可配置的特性成為主流工具。而其背后的關鍵支撐之一&#xff0c;便…

《AI大模型應知應會100篇》第23篇:角色扮演技巧:讓AI成為你需要的專家

第23篇&#xff1a;角色扮演技巧&#xff1a;讓AI成為你需要的專家 摘要 在當今人工智能快速發展的時代&#xff0c;大模型已經不僅僅是簡單的問答工具&#xff0c;它們可以通過角色扮演技巧模擬各類專家身份&#xff0c;從而為用戶提供更專業、更有針對性的服務。本文將深入探…

Windows系統安裝RustDesk Server的詳細步驟和客戶端設置

Windows系統安裝RustDesk Server的詳細步驟 在Windows系統上安裝RustDesk Server涉及幾個關鍵步驟,包括安裝必要的依賴、下載RustDesk Server程序、配置并啟動服務。以下是詳細的步驟: 1. 安裝Node.js和PM2 RustDesk Server的某些版本可能需要Node.js環境來運行,而PM2是一…