數據結構01:鏈表

數據結構

鏈表

鏈表和數組的區別

1. 存儲方式

  • 數組
    • 元素在內存中連續存儲,占用一塊連續的內存空間
    • 元素的地址可以通過索引計算(基地址 + 索引 × 元素大小)
    • 大小固定,在創建時需要指定容量
  • 鏈表
    • 元素(節點)在內存中分散存儲,不要求連續
    • 每個節點包含數據和指向下一個(或上一個)節點的指針
    • 大小動態變化,可根據需要隨時增減節點

2. 訪問效率

  • 數組
    • 支持隨機訪問,通過索引可以直接訪問任意元素,時間復雜度為 O (1)
    • 訪問效率高,適合需要頻繁隨機訪問的場景
  • 鏈表
    • 不支持隨機訪問,必須從表頭(或表尾)開始依次遍歷,時間復雜度為 O (n)
    • 訪問效率低,不適合需要頻繁隨機訪問的場景

3. 插入和刪除操作

  • 數組
    • 插入 / 刪除元素時,需要移動該位置后的所有元素,時間復雜度為 O (n)
    • 尤其在數組頭部操作時效率極低
    • 動態擴容時需要重新分配內存并復制元素
  • 鏈表
    • 插入 / 刪除元素時,只需修改相關節點的指針,時間復雜度為 O (1)(已知前驅節點時)
    • 不需要移動其他元素,操作效率高
    • 沒有擴容問題,內存利用率更高

4. 內存占用

  • 數組
    • 可能存在內存浪費(預分配的容量可能大于實際需要)
    • 內存利用率較低
  • 鏈表
    • 每個節點需要額外存儲指針信息,有一定內存開銷
    • 但整體內存利用率更高,不會浪費空間

5. 適用場景

  • 數組
    • 適合需要頻繁隨機訪問元素的場景(如查找操作多)
    • 元素數量固定或變化不大的情況
    • 例如:數據庫索引、矩陣存儲、緩存實現等
  • 鏈表
    • 適合需要頻繁插入和刪除元素的場景
    • 元素數量動態變化較大的情況
    • 例如:鏈表式隊列 / 棧、哈希表鏈地址法沖突解決、鄰接表等

總結對比表

特性數組鏈表
存儲方式連續內存分散內存 + 指針
隨機訪問支持 (O (1))不支持 (O (n))
插入刪除低效 (O (n))高效 (O (1))
內存效率可能浪費空間有指針開銷但利用率高
大小固定動態
  • 數組中的數據我們稱之為元素

  • 鏈表中的數據我們稱之為節點

    每一個節點都是一個結構體,當前結構體包含兩種信息

    1. 數據(每個節點中所存儲的信息)
    2. 節點指針(保存下一個節點的信息)
    將節點插入鏈表:頭插法/尾插法/中間插入

    eg:

                                                節點對應結構體
typedef struct Node 
{int num;		   /每個節點中存儲的數據,可以有多個struct Node* pNext;   /用于保存下一個節點(結構體)的指針
} Node;函數功能:      創建一個節點int n --------當前節點的數據NODE*  head---------當前鏈表首節點地址返回類型:成功返回當前節點首地址,失敗返回NULLNODE* createNode(int n,NODE* head)
{//創建一個新節點NODE* pNew = (NODE*)malloc(sizeof(NODE));if(pNew == NULL){printf("createNode %d fail:%s!\n",n,strerror(errno));return NULL;}//初始化新節點中的成員變量pNew -> num = n;pNew -> pNext = NULL;//返回當前節點的首地址return pNew;}函數功能:      刪除整個鏈表NODE*  head---------當前鏈表首節點地址void distroyList(NODE* head){if(head == NULL){return;}NODE* P = head;while(p != NULL){head = p -> pNext;free(p);p = head;}}函數功能:    輸出整個鏈表NODE*  head---------當前鏈表首節點地址返回類型:成功返回當前節點首地址,失敗返回NULLvoid displayList(NODE* head){while(p != NULL){printf("%d",p->num);p = p->pNext;}}                                  void insert_head1(int n,NODE** head)
{//創建新節點NODE*  pNew = createNode(n);//如果是空鏈表if(*head == NULL){*head = pNew;return}//新節點指向原鏈表的首節點pNew -> pNext = *head;//將新節點的起始地址給*head*head = pNew;}NODE*	 insert_head2(int n,NODE* head)
{NODE*  pNew = createNode(n);//如果是空鏈表if(head == NULL){return pNew;}pNew -> pNext = *head;//將新節點的起始地址給*headreturn  pNew;}//插入到結尾NODE* insert_tail(int n, NODE* head)
{//創建節點NODE* pNew == createNode(n);if(pNew == NULL){return pNew;}//獲取原鏈表尾節點的指針NODE* pTail = getTaiilNode(head);if(pTail) = getTaiilNode(head);{return pNew;}pTail ->P=pNext = pNew;return head;}NODE* insertNode(int n,NODE* head,int pos)
{}int main()
{// 用于記錄當前鏈表中首節點的地址NODE* pHead = NULL;// 將節點插入鏈表中:頭插法//insert_head1(5, &pHead);//insert_head1(4, &pHead);//insert_head1(3, &pHead);//insert_head1(2, &pHead);//insert_head1(1, &pHead);//pHead = insert_head2(-5, pHead);//pHead = insert_head2(-4, pHead);//pHead = insert_head2(-3, pHead);//pHead = insert_head2(-2, pHead);//pHead = insert_head2(-1, pHead);// 將節點插入鏈表中:尾插法//pHead = insert_tail(1, pHead);//pHead = insert_tail(2, pHead);//pHead = insert_tail(3, pHead);//pHead = insert_tail(4, pHead);// 將節點插入鏈表中:任意位置插入// 假設位置 0 代表頭插pHead = insertNode(1, pHead, 3);displayList(pHead);distroyList(pHead);return 0;
}

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

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

相關文章

【Java學習|黑馬筆記|Day21】IO流|緩沖流,轉換流,序列化流,反序列化流,打印流,解壓縮流,常用工具包相關用法及練習

標題【Java學習|黑馬筆記|Day20】 今天看的是黑馬程序員的《Java從入門到起飛》下部的95-118節,筆記包含IO流中的字節、字符緩沖流,轉換流,序列化流反序列化流,打印流,解壓縮流,常用工具包相關用法及練習 …

API網關原理與使用場景詳解

一、API網關核心原理 1. 架構定位 #mermaid-svg-hpDCWfqoiLcVvTzq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hpDCWfqoiLcVvTzq .error-icon{fill:#552222;}#mermaid-svg-hpDCWfqoiLcVvTzq .error-text{fill:#5…

OSPF路由協議——上

OSPF路由協議 RIP的不足 以跳數評估的路由并非最優路徑如果RTA選擇s0/0傳輸,傳輸需時會大大縮短為3s 最大跳數為16跳,導致網絡尺度小RIP協議限制網絡直徑不能超過16跳,并且16跳為不可達。 收斂速度慢 RIP 定期路由更新 更新計時器&#xff1a…

(LeetCode 面試經典 150 題) 219. 存在重復元素 II (哈希表)

題目&#xff1a;219. 存在重復元素 II 思路&#xff1a;哈希表&#xff0c;時間復雜度0(n)。 哈希表記錄每個數最新的下標&#xff0c;遇到符合要求的返回true即可。 C版本&#xff1a; class Solution { public:bool containsNearbyDuplicate(vector<int>& nums,…

Cookies 詳解及其與 Session 的協同工作

Cookies 詳解及其與 Session 的協同工作 一、Cookies 的本質與作用 1. 什么是 Cookies&#xff1f; Cookies 是由服務器發送到用戶瀏覽器并存儲在本地的小型文本文件。核心特性&#xff1a; 存儲位置&#xff1a;客戶端瀏覽器數據形式&#xff1a;鍵值對字符串&#xff08;最大…

DeepSeek Janus Pro本地部署與調用

step1、Janus模型下載與項目部署 創建文件夾autodl-tmp https://github.com/deepseek-ai/Janus?tabreadme-ov-file# janusflow 查看是否安裝了git&#xff0c;沒有安裝的話安裝一下&#xff0c;或者是直接github上下載&#xff0c;上傳到服務器&#xff0c;然后解壓 git --v…

【Elasticsearch】BM25的discount_overlaps參數

discount_overlaps 是 Elasticsearch/Lucene 相似度模型&#xff08;Similarity&#xff09;里的一個布爾參數&#xff0c;用來決定&#xff1a;> 在計算文檔長度歸一化因子&#xff08;norm&#xff09;時&#xff0c;是否忽略“重疊 token”&#xff08;即位置增量 positi…

Linux | LVS--Linux虛擬服務器知識點(上)

一. 集群與分布式1.1 系統性能擴展方式當系統面臨性能瓶頸時&#xff0c;通常有以下兩種主流擴展思路&#xff1a;Scale Up&#xff08;向上擴展&#xff09;&#xff1a;通過增強單臺服務器的硬件配置來提升性能&#xff0c;這種方式簡單直接&#xff0c;但受限于硬件物理極限…

【Linux-云原生-筆記】keepalived相關

一、概念Keepalived 是一個用 C 語言編寫的、輕量級的高可用性和負載均衡解決方案軟件。 它的主要目標是在基于 Linux 的系統上提供簡單而強大的故障轉移功能&#xff0c;并可以結合 Linux Virtual Server 提供負載均衡。1、Keepalived 主要提供兩大功能&#xff1a;高可用性&a…

計算機網絡:概述層---計算機網絡的組成和功能

&#x1f310; 計算機網絡基礎全景梳理&#xff1a;組成、功能與核心機制 &#x1f4c5; 更新時間&#xff1a;2025年7月21日 &#x1f3f7;? 標簽&#xff1a;計算機網絡 | 網絡組成 | 分布式 | 負載均衡 | 資源共享 | 網絡可靠性 | 計網基礎 文章目錄前言一、組成1.從組成部…

Linux中scp命令傳輸文件到服務器報錯

上傳本地文件到Linux服務器使用scp命令報錯解決辦法使用scp命令報錯 Could not resolve hostname e: Name or service not known 解決辦法 不使用登錄服務器的工具傳輸&#xff0c;打開本地cmd&#xff0c;使用scp命令傳輸即可。 scp E:\dcm-admin.jar root127.0.0.1:/

歷史數據分析——國藥現代

醫藥板塊走勢分析: 從月線級別來看 2008年11月到2021年2月,月線上走出了兩個震蕩中樞的月線級別2085-20349的上漲段; 2021年2月到2024年9月,月線上走出了20349-6702的下跌段; 目前月線級別放巨量,總體還在震蕩區間內,后續還有震蕩和上漲的概率。 從周線級別來看 從…

#Linux內存管理# 在一個播放系統中同時打開幾十個不同的高清視頻文件,發現播放有些卡頓,打開視頻文件是用mmap函數,請簡單分析原因。

在播放系統中同時使用mmap打開幾十個高清視頻文件出現卡頓&#xff0c;主要原因如下&#xff1a;1. 內存映射&#xff08;mmap&#xff09;的缺頁中斷開銷按需加載機制&#xff1a;mmap將文件映射到虛擬地址空間&#xff0c;但實際數據加載由“缺頁中斷&#xff08;Page Fault&…

AI黑科技:GAN如何生成逼真人臉

GAN的概念 GAN(Generative Adversarial Network,生成對抗網絡)是一種深度學習模型,由生成器(Generator)和判別器(Discriminator)兩部分組成。生成器負責生成 synthetic data(如假圖像、文本等),判別器則試圖區分生成數據和真實數據。兩者通過對抗訓練不斷優化,最終…

FireFox一些設置

firefox后臺打開新的鏈接&#xff0c;例如中鍵打開一個鏈接 地址欄輸入about:config 找到下面三項&#xff0c;全部設為true browser.tabs.loadInBackground browser.tabs.loadDivertedInBackground browser.tabs.loadBookmarksInBackground 參考&#xff1a;FireFox/chrome…

【黑馬SpringCloud微服務開發與實戰】(六)分布式事務

1. 什么是分布式事務下單失敗&#xff0c;購物車還被清理了。不符合一致性。2. seata的架構和原理3. 部署TC服務docker network ls docker inspect mysql mysql 在hm-net下&#xff0c;這里我的ncaos不是跟著視頻配的&#xff0c;因此需要。 docker network connect hm-net nac…

【力扣】第15題:三數之和

原文鏈接&#xff1a;15. 三數之和 - 力扣&#xff08;LeetCode&#xff09; 思路解析 雙指針&#xff1a; &#xff08;1&#xff09;頭尾指針對應值相加如果大于目標值(target)&#xff0c;那么只能尾指針-1&#xff1b;如果小于target&#xff0c;那么只能頭指針1。 &#x…

Linux PCI總線子系統

The Linux Kernel Archives Linux PCI總線子系統 — The Linux Kernel documentation

LeetCode熱題100--24. 兩兩交換鏈表中的節點--中等

1. 題目 給你一個鏈表&#xff0c;兩兩交換其中相鄰的節點&#xff0c;并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題&#xff08;即&#xff0c;只能進行節點交換&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4] 輸出&#x…

京東視覺算法面試30問全景精解

京東視覺算法面試30問全景精解 ——零售智能 供應鏈創新 工業落地:京東視覺算法面試核心考點全覽 前言 京東作為中國領先的零售科技企業,在智能物流、供應鏈管理、智能倉儲、商品識別、工業質檢等領域持續推動視覺AI的創新與大規模落地。京東視覺算法崗位面試不僅關注候…