數據結構復習2

第二章 線性表

2.1線性表的定義和基本操作

線性表:一種邏輯結構,表示數據元素之間的一對一線性關系(如數組、鏈表、棧、隊列等)。

2.1.1線性表的定義

線性表是具有相同數據類型的n(n>0)個數據元素的有限序列。
(其中n為表長,當n=0時線性表是一個空表。若用L命名線性表,則其一般表示為)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

  • 幾個概念:
    1.?aiai是線性表中的“第i個”元素線性表中的位序。
    2.?a1a1是表頭元素;anan是表尾元素。
    3.?除第一個元素外,每個元素有且僅有一個直接前驅:除最后一個元素外,每個元素有且僅有一個直接后繼。

  • 存儲結構:
    1. 順序存儲結構:順序表
    2. 鏈式存儲結構:鏈表

2.2順序表

順序表:線性表的一種物理實現方式,通過連續內存空間存儲元素(即數組實現的線性表)。

2.2.1順序表的概念

  • 順序表:用順序存儲的方式實現線性表順序存儲。把邏輯上相鄰的元素存儲在物理位置上也相鄰的存儲單元中,元素之間的關系由存儲單元的鄰接關系來體現。
  • 順序表的特點
  1. 隨機訪問,即可以在O(1)時間內找到第i個元素。
  2. 存儲密度高,每個節點只存儲數據元素。
  3. 擴展容量不方便。
  4. 插入刪除操作不方便,需移動大量元素:O(n)。

2.2.2順序表的實現

2.2.3順序表的基本操作?

操作移動方向起始位置目的
插入從表尾開始向后移動最后一個元素防止覆蓋未處理的元素
刪除從刪除位置開始向前移動刪除位置的下一個直接覆蓋,無需額外緩存

2.3線性表的鏈式表示

2.3.1單鏈表

  • 特點:
    優點:不要求大片連續空間,改變容量方便。
    缺點:不可隨機存取,要耗費一定空間存放指針。

  • 基礎操作總結?
操作核心思想時間復雜度邊界條件
頭部插入新節點指向原頭節點,更新頭指針O(1)空鏈表
尾部插入遍歷到末尾,鏈接新節點O(n)空鏈表
指定位置插入找到前驅節點,調整指針O(n)前驅節點不存在
刪除頭節點頭指針后移,釋放原頭節點O(1)空鏈表
刪除指定節點找到前驅節點,跳過目標節點并釋放O(n)目標節點不存在或為頭節點
修改節點遍歷找到目標節點,更新數據O(n)目標節點不存在
按值查找遍歷鏈表,匹配數據O(n)無匹配
按位置查找遍歷到指定索引O(n)索引越界
  • ?單鏈表的建立

  1. Step 1:初始化一個單鏈表
  2. Step 2:每次取一個數據元素,插入到表尾/表頭
  • 尾插法建立單鏈表
    平均時間復雜度O(n)
    思路:每次將新節點插入到當前鏈表的表尾,所以必須增加一個尾指針r,使其始終指向當前鏈表的尾結點。好處:生成的鏈表中結點的次序和輸入數據的順序會一致。
  • 頭插法建立單鏈表
    平均時間復雜度O(n) 思路:新節點始終插入鏈表頭部,最終鏈表順序與輸入順序相反。
  • ?鏈表的逆置:
    LNode *Inverse(LNode *L)
    {LNode *p, *q;p = L->next;     //p指針指向第一個結點L->next = NULL;  //頭結點指向NULLwhile (p != NULL){q = p;p = p->next;q->next = L->next;  L->next = q;}return L;

    2.3.2雙鏈表

雙鏈表是一種比單鏈表更復雜的鏈式數據結構,每個節點包含兩個指針,分別指向前驅節點(prev)和后繼節點(next),從而支持雙向遍歷。

2.3.3循環鏈表?

循環鏈表是鏈表的變種,其特點是?尾節點的指針不再指向?NULL,而是指向頭節點,形成一個環形結構。根據方向性,可分為?單向循環鏈表?和?雙向循環鏈表

?2.3.4順序表和鏈表的比較

【邏輯結構】

  • 順序表和鏈表都屬于線性表,都是線性結構

【存儲結構】

  • 順序表:順序存儲,使用數組存儲,元素在內存中物理地址連續

    • 優點:支持隨機存取,存儲密度高
    • 缺點:大片連續空間分配不方便,改變容量不方便
  • 鏈表:鏈式存儲,通過節點和指針鏈接,元素在內存中物理地址分散。

    • 優點:離散的小空間分配方便,改變容量方便
    • 缺點:不可隨機存取,存儲密度低

  • ?核心區別
特性順序表(數組實現)鏈表(指針實現)
存儲方式連續內存空間非連續內存,通過指針鏈接節點
隨機訪問支持,時間復雜度?O(1)不支持,需遍歷,時間復雜度?O(n)
插入/刪除平均?O(n)(需移動元素)平均?O(1)(修改指針)
空間利用率無額外指針開銷,但可能浪費預分配空間每個節點需存儲指針,但動態擴容無浪費
內存分配靜態(固定大小)或動態(可擴容)動態分配(按需申請釋放)
緩存友好性高(連續內存,預加載效率高)低(內存分散,易引發緩存未命中)
適用場景高頻查詢、元素數量穩定頻繁插入/刪除、元素數量變化大
  • 操作效率?
操作順序表鏈表
訪問第i個元素O(1)(直接通過下標訪問)O(n)(需從頭遍歷)
頭部插入O(n)(需移動所有元素)O(1)(修改頭指針)
尾部插入O(1)(若空間足夠)O(1)(維護尾指針時)
中間插入O(n)O(1)(已知前驅節點時)
擴容O(n)(需遷移數據)O(1)(動態分配節點)

【內存管理】

  • 順序表

    • 靜態分配:大小固定(如C靜態數組)。

    • 動態分配:可擴容但需復制數據(如C++?vector)。

  • 鏈表

    • 動態分配節點,無容量限制(除非內存耗盡)

【總結】

維度順序表鏈表
本質數組指針鏈接的節點
核心優勢訪問快、緩存友好插入/刪除高效、動態擴容
核心劣勢插入/刪除慢、擴容成本高訪問慢、內存碎片化

2.4一些面試題?

2.4.1用一句話解釋順序表和鏈表

? 邏輯上相鄰的元素在物理存儲上也相鄰(插入刪除需要移動元素)

? 邏輯上相鄰的元素物理上不一定相鄰(插入刪除不需要移動元素)?

2.4.2?頭指針和頭結點的區別?引入頭結點的優點

區別: 頭指針是指向鏈表第一個節點的指針,是訪問鏈表的入口;而頭結點是鏈表開頭的一個附加節點,其數據域通常不存儲業務數據。

注: 頭結點的指針域指向線性表的第一個元素結點。

引入頭結點的優點:

① 由于第一個數據結點的位置被存放在頭結點的指針域中,因此在鏈表的第一個位置上的操作和在表的其他位置上的操作保持一致,無需進行特殊處理。

② 無論鏈表是否為空,其頭指針都是指向頭結點的非空指針(空表中頭結點的指針域為空),因此空表和非空表的處理也就得到了統一。

2.4.3如何判斷鏈表有環

窮舉遍歷:設一個檢測指針 k 和一個遍歷指針 q,count 記錄遍歷指針 q 走的步數。遍歷指針每走一步,檢測指針 k 就走遍歷指針 q 之前走過的節點,若發現相同的節點便說明有環,直到遍歷節點 q 遍歷完整個鏈表,即q = NULL 為止。時間復雜度O(n^2),空間復雜度O(1)

標記法:在結點中設置一個標記變量,每走一個結點,就判斷一次。若 visit == true,則說明有環。反之,說明無環。時間復雜度O(n),空間復雜度O(n)

快慢指針:設置兩個指針,一個慢指針 low 和一個快指針 fast。初始值 慢指針 low 指向第一個結點,快指針 fast 指向第二個結點。只要快指針不為空,則慢指針slow就先向后走一個。然后兩輪處理快指針。只要未遍歷完鏈表,則將快指針向后移動一個,并判斷快慢指針是否相遇。一旦快慢指針相遇,則說明有環。反之,則說明無環。時間復雜度O(n),空間復雜度O(1)

set 集合大小變化:根據集合的去重特性來判斷。每遍歷一個結點,就將該結點加入集合。若加入該新結點后,集合大小不再發生變化,則說明集合中的該元素已存在,即說明存在環。倘若,遍歷完所有結點,集合大小都能正常判斷,則無環。時間復雜度O(n),空間復雜度O(n)

2.4.4?線性表包括了順序表和鏈表,請比較它們的區別。★★

(1)存取(讀寫)方式

? ? ? ?順序表可以順序存取,也可以隨機存取。

? ? ? ?鏈表只能順序存取。

(2)邏輯結構與物理結構

? ? ? ?順序存儲:邏輯上相鄰的元素,物理存儲位置也相鄰。

? ? ? ?鏈式存儲:邏輯上相鄰的元素,物理存儲位置不一定相鄰,對應的邏輯關系是通過指針鏈接來表示的。

(3)查找、插入和刪除操作

? ? ? ?查找:

? ? ? ?對于按值查找,順序表無序時,兩者的時間復雜度均為O(n); 順序表有序時,可采用折半查找,此時的時間復雜度為O(logn) 。

? ? ? ?對于按序號查找,順序表支持隨機訪問,時間復雜度僅為0(1), 而鏈表的平均時間復雜度為O(n)。

? ? ? ?插入、刪除:

? ? ? ?順序表的插入、刪除操作,平均需要移動半個表長的元素。

? ? ? ?鏈表的插入、刪除操作,只需修改相關結點的指針域即可。由于鏈表的每個結點都帶有指針域,故而存儲密度不夠大。

?

?

?

?

?

?

?

?

?

?

?

?

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

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

相關文章

空間轉錄組benchmark 相關 讀完scGPT spatial 和 空間單細胞基因乳房細胞數據集文章之后

文章目錄 ? 空間轉錄組測序方式總體劃分🧬 成像型空間轉錄組(Imaging-based ST)原理:技術代表 & 特點:優點:局限: 🧬 測序型空間轉錄組(Sequencing-based ST&#x…

清理華為云服務器內存使用率

這里寫自定義目錄標題 一、正確終止進程:不要帶尖括號二、看清楚誰“真吃”了內存三、臨時清掉緩存(謹慎用)四、長期優化1. 給系統加個 Swap2. 調整 MySQL 內存配置3. 水平/垂直擴容4. 告警 總結與下一步 華為云的“內存使用率”默…

Go 語言中的 package 和 go modules

1、package 的定義和導入 在任何大型軟件項目中,代碼的組織和管理都是至關重要的。Go 語言通過 包(Package) 的概念來解決這個問題,它不僅是代碼組織的基礎,也是代碼復用的關鍵。本文將深入探討 Go 語言中包的定義、規…

C#語言入門-task4 :C#語言的高級應用

C# 作為一門現代化、面向對象的編程語言,在企業級應用、游戲開發、移動應用、云計算等領域有著廣泛的應用。以下是 C# 語言的一些高級應用場景和技術方向: 一、高級語言特性與編程范式 1. 異步編程(Async/Await) 應用場景&…

FastAPI vs Flask vs Django:Python Web框架全面對比

Python 作為最受歡迎的編程語言之一,其 Web 開發生態極為豐富。FastAPI、Flask 和 Django 是當前主流的三大 Python Web 框架,各有千秋。本文將從架構設計、開發效率、性能表現、生態支持、適用場景等方面,全面對比這三大框架,幫助…

如何從零開始掌握Pandas的DataFrame使用

視頻演示 如何通過實例學習Pandas DataFrame的創建與數據訪問 🧩 理解 Pandas DataFrame:數據分析的核心結構 Pandas 是 Python 中用于數據分析與處理的主力庫,而 DataFrame 是 Pandas 最常用的二維表格數據結構。我們可以將其想象成一個 Ex…

LaTeX下載與實踐入門指南

LaTeX下載與實踐入門指南 簡單來說,LaTeX 是一種以代碼驅動的排版系統。和 Word 那種所見即所得(WYSIWYG)的編輯方式不同,LaTeX 更像是你寫代碼、它幫你生成精美排版。你寫的不是文字排版,而是一種“結構化內容&#…

Java--數組

目錄 1.1 介紹:數據可以存放多個同一類型的數據。 1.2 排序: 冒泡排序法: 1.3 查找 1. 順序查找 2. 二分查找 二維數組: 楊輝三角: 1.1 介紹:數據可以存放多個同一類型的數據。 數組的引用&#xf…

地址簇與數據序列

深入理解IP地址與端口號:網絡通信的基礎 IP地址:互聯網的門牌號 IP地址(Internet Protocol Address)是分配給網絡中每臺設備的唯一標識符,就像現實世界中的門牌號一樣。在計算機上,一個網卡對應一個IP地址…

中學數集相等概念凸顯無窮集不可~其真子集——初數一直將不是N的真子集誤為?N

中學數集相等概念凸顯無窮集不可~其真子集——初數一直將不是N的真子集誤為?N 黃小寧 [摘要]證明了初等數學應有幾何起碼常識:當且僅當平移的距離0時才能使平移前、后的點集(元點不少于兩個)重合。從而表明初中的直線公理使中學…

常規層疊設計需要了解的板材知識

常規層疊設計需要了解的板材知識: 層疊設計的第一個關鍵要點就是要了解板材的基本知識。 觀點: PCB是由銅箔(“皮”)、樹脂(“筋”)、玻璃纖維布及其他功能性補強添加物(“骨”)組成。層疊設計時,要對“筋骨皮”的材料特性參數有一定了解。 先來看看“皮”,在對常…

Zabbix 監控VMware Vcenter

本次實驗測試如何在Zabbix中添加Vcenter監控對象實現對VMware虛擬化平臺的監控。 一、測試環境 1、Zabbix服務器配置: Zabbix 版本: Zabbix 7.0.11 LTS 操作系統: Ubuntu 24.04 數據庫: MySQL 8 Web 服務器: Apache IP:192.168.1.242 2、監控目標…

鏈表最終章——雙向鏈表及其應用

———————————本文旨在交流探討計算機知識,歡迎交流指正———————————— 上一章,我們介紹了鏈表的循環擴展,但是,單向鏈表畢竟是單向查詢的,就算是經過循環來查找,終究是效率偏低&#x…

智能體的5個核心要素

文章目錄 如何看待智能體智能體的發展階段國內大模型廠家推出的智能體智能體的應用領域智能體架構智能體的核心要素1. ??認知中樞(大模型)??🧠 2. ??記憶系統(Memory)??🛠? 3. ??規劃與決策&…

QUdpScoket 組播實現及其中的踩坑點記錄

QUdpScoket 組播實現及其中的踩坑點記錄 QUdpSocket要想組播需要打開MulticastTtlOption配置項,否則無法生效,親身踩坑經歷 m_socketnew QUdpSocket(this);m_socket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);確定一個組播地址&…

250627-結合Guacamole與FRP訪問CentOS-Stream-9及Windows10

A. FRP的配置 A.1 FRP在CentOS中的配置 frps.toml [common] bind_port 7000 bind_addr 0.0.0.0dashboard_port 7500 dashboard_user admin dashboard_pwd admin啟動:./frps -c frps.toml frpc.toml [common] server_addr 123.456.789.98 server_port 700…

環保法規下的十六層線路板創新:獵板 PCB 如何實現無鉛化與可持續制造

在全球環保法規趨嚴的背景下,十六層線路板作為高端電子設備的核心組件,正面臨無鉛化與可持續制造的雙重挑戰。獵板 PCB 憑借材料革新與工藝升級,構建了從焊料到基材、從生產到回收的全鏈路綠色體系,為行業樹立了合規標桿。 一、無…

OpenLayers 拖動旋轉和縮放

前言 在 OpenLayers 框架中已經封裝了很多便利的交互控件,可以做到開箱即用,非常方便。像拖動縮放、繪制、選擇等交互控件可以供開發者直接使用。本篇給大家介紹拖動旋轉交互控件 1. 旋轉控件簡介 此控件通過按住shift鍵結合鼠標左鍵或右鍵進行使用。在…

element ui Cascader 級聯選擇器 處理未全選時去除父節點值,選中父節點時去除子節點值

目前我這邊的需求時:當用戶的選擇,只保留最頂層的選中節點 如果選中了父節點,則移除其所有子孫節點以及它的祖先節點(因為選中父節點代表選中整個分支,所以不需要再顯示子節點;同時,如果存在祖…

uniapp實現遠程圖片下載到手機相冊功能

在 UniApp 中實現點擊下載圖片到相冊的功能&#xff0c;需要以下幾個步驟&#xff1a; 1. 下載圖片到本地&#xff08;uni.downloadFile&#xff09; 2. 將圖片保存到相冊&#xff08;uni.saveImageToPhotosAlbum&#xff09; 完整代碼示例&#xff1a; <template>&l…