2.4 雙向鏈表

目錄

引入

結構定義

結構操作

初始化

插入

刪除

打印

查找

隨機位置插入

隨機位置刪除

銷毀

總結


數據結構專欄https://blog.csdn.net/xyl6716/category_13002640.html

?精益求精? ?追求卓越


【代碼倉庫】:Code Is Here

【合作】 :apollomonasa@gmail.com

引入

前面我們已經學習了單鏈表及其基本應用,了解到單鏈表可以單向遍歷,一般無頭,也可以有頭,這里的頭就是虛擬頭節點(Dummy Head),比特就業課的老師喜歡管這個叫做哨兵位,其他地方沒聽過,不過不重要,這個頭通常用來占位置,方便遍歷的時候避免特判討論。此外還要引入循環的概念,就是鏈表最后一個節點指向第一個有效節點,以此實現循環的效果,結構上體現為環形鏈表。

由此,鏈表就根據帶頭、單雙向、循環可以分為8種,而今天主要介紹雙向鏈表,它是通過存儲前驅后繼指針來實現雙向訪問的。
實際上這里介紹的是帶頭雙向循環鏈表

結構定義

和單鏈表相比,只是增加了一個指針字段,可以概括為,數據區+前驅指針+后繼指針,只增加了一個指針,即可實現雙向訪問。

然后,將每個節點如圖連接后,就形成了雙向循環鏈表。


結構操作

接下來將介紹一些常用的操作的實現和代碼。

初始化

首先是參數列表的設計,由于我們需要知道鏈表的頭,并且還涉及到修改鏈表的頭指針,所以應該傳入頭指針的地址,也就是二級指針。

其次是前驅后繼的指向,由于我們的結構定義指出鏈表的頭的前驅是尾,尾的后繼是頭,所以對于一開始只有虛擬頭節點的空表來說,前驅后繼都是自己

插入

為了方便,編寫一個輔助函數,用于創建新節點

接下來就是尾插操作,創建新節點之后,需要修改的只有頭的前驅,尾的后繼,以及新節點的前驅后繼,優先修改新節點以保留原鏈表信息,然后再修改尾的后繼,最后修改頭的前驅。這個順序是最方便操作的,如果調換,就會發現不太容易找到尾。

剩下的頭插也是大同小異,不多贅述,且看代碼:

刪除

這里有pop_back 和 pop_front,二者大同小異,代碼及其相似。

基本思路是先記錄要刪除的節點,然后站在這個節點調整被它影響到的它前驅和后繼的指針,最后釋放掉待刪除節點的內存。

此處補充一個輔助函數empty

打印

打印就是遍歷,和單向鏈表并無不同,只不過判斷終止條件從空指針變成了Dummy Head

打印效果示例

經過測試,頭刪和尾刪功能都正常。

查找

查找功能本質上還是遍歷,只是加上一個條件判斷。

隨機位置插入

隨機位置刪除

銷毀


總結

比起單鏈表,雙向鏈表的結構定義雖然更多了,但是結構操作普遍在代碼長度和時間復雜度上都更簡單,就比如尾插和頭插都是O(1)的。換句話說,占用內存更多,運行時間更短,這就是所謂空間換時間。這種時空互換的觀念在今后的數據結構學習中還會有更多體現,但在今天初現端倪。

此外,初始化并不一定要像我那樣實現,可以設計成返回初始化后的Dummy Head,這樣使得函數調用更加一致,避免了傳入二級指針。

至此,線性表中的順序表和鏈表就講完了,下一篇文章正式開啟棧和隊列的學習,并且此后的文章在風格上不會有太大改變,但是在設計上會更加完整,篇幅會大大增加,一種數據結構不會再分為好幾篇文章講解,方便讀者查閱。

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

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

相關文章

開發指南132-DOM的寬度、高度屬性

寬度、高度類似。這里以高度為例來說明DOM中有關高度的概念:1、height取法:element.style.height說明:元素內容區域的高度,不含padding、border、margin該屬性可寫2、clientHeight取法:element..clientHeight&#xff…

魔改chromium源碼——解除 iframe 的同源策略

在進行以下操作之前,請確保已完成之前文章中提到的 源碼拉取及編譯 部分。 如果已順利完成相關配置,即可繼續執行后續操作。 同源策略限制了不同源(協議、域名、端口)的網頁腳本訪問彼此的資源。iframe 的跨域限制由 Blink 渲染引擎和 Chromium 的安全層共同實現。 咱們直…

在鴻蒙中實現深色/淺色模式切換:從原理到可運行 Demo

摘要 現在幾乎所有主流應用都支持“深色模式”和“淺色模式”切換,這已經成了用戶習慣。鴻蒙(HarmonyOS)同樣提供了兩種模式(dark / light),并且支持應用根據系統主題切換,或者應用內手動切換。…

Redux搭檔Next.js的簡明使用教程

Redux 是一個用于 JavaScript 應用的狀態管理庫,主要解決組件間共享狀態和復雜狀態邏輯的問題。當應用規模較大、組件層級較深或多個組件需要共享/修改同一狀態時,Redux 可以提供可預測、可追蹤的狀態管理方式,避免狀態在組件間混亂傳遞。Red…

SCAI采用公平發射機制成功登陸LetsBonk,60%代幣供應量已鎖倉

去中心化科學(DeSci)平臺SCAI宣布,其代幣已于今日以Fair Launch形式在LetsBonk.fun平臺成功發射。為保障資金安全與透明,開發團隊已將代幣總量的60%進行鎖倉,進一步提升社區信任與項目合規性。SCAI是一個專注于高質量科…

【Kubernetes系列】Kubernetes中的resources

博客目錄1. limits(資源上限)2. requests(資源請求)關鍵區別其他注意事項示例場景在 Kubernetes (k8s) 中,resources 用于定義容器的資源請求(requests)和限制(limits)&a…

hadoop 前端yarn 8088端口查看任務執行情況

圖中資源相關參數含義及簡單分析思路&#xff1a; 基礎資源搶占參數 Total Resource Preempted: <memory:62112, vCores:6> 含義&#xff1a;應用總共被搶占的資源量&#xff0c; memory:62112 表示累計被收回的內存&#xff08;單位通常是MB &#xff0c;結合Hadoop生態…

基于SpringBoot的個性化教育學習平臺的設計與實現(源碼+lw+部署文檔+講解等)

課題介紹在教育數字化轉型與學習者需求差異化的背景下&#xff0c;傳統學習平臺 “統一內容、統一進度” 的模式已顯局限。當前&#xff0c;平臺多提供標準化課程資源&#xff0c;無法根據學習者年齡、基礎、目標&#xff08;如升學、技能提升&#xff09;定制學習路徑&#xf…

UE5多人MOBA+GAS 48、制作閃現技能

文章目錄添加標簽添加GA_Blink添加標簽 CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Blink_Teleport)CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_Blink_Cooldown)UE_DEFINE_GAMEPLAY_TAG_COMMENT(Ability_Blink_Teleport, "Ability.Blink.Teleport"…

Swift 實戰:實現一個簡化版的 Twitter(LeetCode 355)

文章目錄摘要描述示例解決答案設計思路題解代碼分析測試示例和結果時間復雜度空間復雜度總結摘要 在社交媒體平臺里&#xff0c;推送機制是核心功能之一。比如你關注了某人&#xff0c;就希望在自己的時間線上能看到他們的最新消息&#xff0c;同時自己的消息也要能出現在別人…

在瀏覽器端使用 xml2js 遇到的報錯及解決方法

在瀏覽器端使用 xml2js 遇到的報錯及解決方法 一、引言 在前端開發過程中&#xff0c;我們常常需要處理 XML 數據。xml2js 是一個非常流行的用于將 XML 轉換為 JavaScript 對象的庫。然而&#xff0c;當我們在瀏覽器端使用它時&#xff0c;可能會遇到一些問題。本文將介紹在瀏覽…

eChart餅環pie中間顯示總數_2個以上0值不擠掉

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>環餅圖顯示總數</title><script src"https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js"></script><style>#main { widt…

Ansible 核心功能進階:自動化任務的靈活控制與管理

一、管理 FACTS&#xff1a;獲取遠程主機的 “身份信息”FACTS 是 Ansible 自動收集的遠程主機詳細信息&#xff08;類似 “主機身份證”&#xff09;&#xff0c;包括主機名、IP、系統版本、硬件配置等。通過 FACTS 可以動態獲取主機信息&#xff0c;讓 Playbook 更靈活1. 查看…

gRPC網絡模型詳解

gRPC協議框架 TCP層&#xff1a;底層通信協議&#xff0c;基于TCP連接。 TLS層&#xff1a;該層是可選的&#xff0c;基于TLS加密通道。 HTTP2層&#xff1a;gRPC承載在HTTP2協議上&#xff0c;利用了HTTP2的雙向流、流控、頭部壓縮、單連接上的多 路復用請求等特性。 gRPC層…

[優選算法專題二滑動窗口——將x減到0的最小操作數]

題目鏈接 將x減到0的最小操作數 題目描述 題目解析 問題重述 給定一個整數數組 nums 和一個整數 x&#xff0c;每次只能從數組的左端或右端移除一個元素&#xff0c;并將該元素的值從 x 中減去。我們需要找到將 x 恰好減為 0 的最少操作次數&#xff0c;如果不可能則返回 -…

AOP配置類自動注入

本文主要探究AopAutoConfiguration配置類里面的bean怎么被自動裝配的。代碼如下&#xff1a;package com.example.springdemo.demos.a05;import com.example.springdemo.demos.a04.Bean1; import com.example.springdemo.demos.a04.Bean2; import com.example.springdemo.demos…

云計算-K8s 實戰:Pod、安全上下文、HPA 、CRD、網絡策略、親和性等功能配置實操指南

簡介 此次圍繞Kubernetes 日常管理中的核心場景,提供了從基礎到進階的實操配置指南。內容涵蓋 9 大關鍵知識點:從使用 nginx 鏡像創建 QoS 類為 Guaranteed 的 Pod,到為 Pod 配置安全上下文以指定運行用戶和組;從自定義 Student 資源類型(CRD),到配置 Sidecar 實現跨命…

嵌入式LINUX——————TCP并發服務器

一、服務器1.服務器分類單循環服務器&#xff1a;只能處理一個客戶端任務的服務器 并發服務器&#xff1a;可同時處理多個客戶端任務的服務器二、TCP并發服務器的構建1.如何構建&#xff1f; &#xff08;1&#xff09;多進程&#xff08;每一次創建都非常耗時耗空間&#…

論文潤色不能降低文章的重復率

最近大家問到多的&#xff0c;你們潤色好了重復率會不會就降低了。這事兒啊&#xff0c;得從好幾個方面去剖析&#xff0c;今天咱們就一塊兒來探個究竟。咱們先得清楚&#xff0c;重復率檢測工具一般會把內容標記成兩類&#xff1a;一是那些和其他文獻在文字表達上高度相似的部…

Python爬蟲實戰:構建alltheplaces平臺地理信息數據采集系統

1. 引言 1.1 研究背景與意義 在大數據與智慧城市建設的推動下,地理位置信息(如餐館、景點、公共設施等 POI 數據)已成為商業分析、城市規劃、公共服務優化的核心基礎數據。alltheplaces 作為全球領先的開放場所數據平臺,整合了來自多個數據源的標準化信息,涵蓋場所名稱、…