雙向-->帶頭-->循環鏈表

目錄

一、雙向帶頭循環鏈表概述

1.什么是雙向帶頭循環鏈表

2.雙向帶頭循環鏈表的優勢

3.雙向帶頭循環鏈表簡圖

二、雙向帶頭循環鏈表的增刪查改圖解及代碼實現

1.雙向帶頭循環鏈表的頭插

2.雙向帶頭循環鏈表的尾插

3.雙向帶頭循環鏈表的頭刪

4.雙向帶頭循環鏈表的尾刪

5.雙向帶頭循環鏈表在pos位置前插入節點

6.雙向帶頭循環鏈表刪除pos位置節點


一、雙向帶頭循環鏈表概述

1.什么是雙向帶頭循環鏈表

????????雙向:每個節點都帶有一個指向下一個節點的指針(next)和一個直向前一個節點的指針(prev);

????????帶頭:即鏈表帶有哨兵位頭節點,該節點只包含兩個指針,不存儲有效數據;

????????循環:哨兵位頭節點有一個next指針指向第一個有效數據節點,還有一個prev指針指向哨兵位節點的前一個節點即鏈表的尾節點,因此實現了鏈表的循環;

????????雙向帶頭循環鏈表的節點類型:

typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* next;struct ListNode* prev;
}ListNode;

2.雙向帶頭循環鏈表的優勢

????????雙向帶頭循環鏈表不需要我們遍歷每個節點來找尾節點,對于鏈表的尾插而言就變得非常簡單。由于較單向非循環鏈表而言,雙向帶頭循環鏈表多了一個指向前一個節點的指針prev,所以在結構上較為復雜,但實際應用中少了很多的麻煩。

3.雙向帶頭循環鏈表簡圖

?

二、雙向帶頭循環鏈表的增刪查改圖解及代碼實現

1.雙向帶頭循環鏈表的頭插

示意圖:

代碼實現:

// 雙向鏈表頭插
void ListPushFront(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* NewNode = Node_New(x);ListNode* First = pHead->next;NewNode->next = First;First->prev = NewNode;NewNode->prev = pHead;pHead->next = NewNode;
}

2.雙向帶頭循環鏈表的尾插

示意圖:

代碼實現:

// 雙向鏈表尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* NewNode = Node_New(x);ListNode* Tail = pHead->prev;NewNode->prev = Tail;Tail->next = NewNode;NewNode->next = pHead;pHead->prev = NewNode;
}

3.雙向帶頭循環鏈表的頭刪

示意圖:

代碼實現:

// 雙向鏈表頭刪
void ListPopFront(ListNode* pHead)
{assert(pHead);if (pHead->next == pHead){return;}ListNode* First = pHead->next;ListNode* Next = First->next;pHead->next = Next;Next->prev = pHead;free(First);First = NULL;
}

4.雙向帶頭循環鏈表的尾刪

示意圖:

代碼實現:

// 雙向鏈表尾刪
void ListPopBack(ListNode* pHead)
{assert(pHead);if (pHead->next == pHead){return;}ListNode* Tail = pHead->prev;ListNode* Prev = Tail->prev;Prev->next = pHead;pHead->prev = Prev;free(Tail);Tail = NULL;
}

5.雙向帶頭循環鏈表在pos位置前插入節點

示意圖:

代碼實現:

// 雙向鏈表在pos位置的前面插入節點
void ListInsert(ListNode* pos, LTDataType x)
{ListNode* NewNode = Node_New(x);ListNode* Prev = pos->prev;Prev->next = NewNode;NewNode->prev = Prev;NewNode->next = pos;pos->prev = NewNode;
}

6.雙向帶頭循環鏈表刪除pos位置節點

示意圖:

代碼實現:

// 雙向鏈表刪除pos位置的節點
void ListErase(ListNode* pos)
{ListNode* Prev = pos->prev;ListNode* Hind = pos->next;Prev->next = Hind;Hind->prev = Prev;free(pos);pos = NULL;
}

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

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

相關文章

ATF(TF-A) 威脅模型匯總

安全之安全(security)博客目錄導讀 目錄計劃如下,相關內容補充中,待完成后進行超鏈接,敬請期待,歡迎您的關注 1、通用威脅模型 2、SPMC威脅模型 3、EL3 SPMC威脅模型 4、fvp_r 平臺威脅模型 5、RSS-AP接口威脅模型 威脅建模是安全…

淺學實戰:探索PySpark實踐,解鎖大數據魔法!

文章目錄 Spark和PySpark概述1.1 Spark簡介1.2 PySpark簡介 二 基礎準備2.1 PySpark庫的安裝2.2 構建SparkContext對象2.3 SparkContext和SparkSession2.4 構建SparkSession對象2.5 PySpark的編程模型 三 數據輸入3.1 RDD對象3.2 Python數據容器轉RDD對象3.3 讀取文件轉RDD對象…

IDEA的常用設置,讓你更快速的編程

一、前言 在使用JetBrains的IntelliJ IDEA進行軟件開發時,了解和正確配置一些常用設置是非常重要的。IDEA的強大功能和定制性使得開發過程更加高效和舒適。 在本文中,我們將介紹一些常用的IDEA設置,幫助您更好地利用IDEA進行開發。這些設置包…

Java面向對象——封裝以及this關鍵字

封 裝 封裝是面向對象編程(OOP)的三大特性之一,它將數據和操作數據的方法組合在一個單元內部,并對外部隱藏其具體實現細節。在Java中,封裝是通過類的訪問控制修飾符(如 private、protected、public&#x…

Linux MQTT智能家居項目(智能家居界面布局)

文章目錄 前言一、創建工程項目二、界面布局準備工作三、正式界面布局總結 前言 一、創建工程項目 1.選擇工程名稱和項目保存路徑 2.選擇QWidget 3.添加保存圖片的資源文件: 在工程目錄下添加Icon文件夾保存圖片: 將文件放入目錄中: …

網絡層協議

網絡層協議 IP協議基本概念協議頭格式網段劃分特殊的IP地址IP地址的數量限制私有IP地址和公網IP地址路由IP協議頭格式后續 在復雜的網絡環境中確定一個合適的路徑 IP協議 承接上文,TCP協議并不會直接將數據傳遞給對方,而是交付給下一層協議,…

機器學習基礎(四)

KNN算法 KNN:K-Nearest Neighbor,最近領規則分類。 為了判斷位置實例的類別,以所有已知類別的實例作為參照選擇參數K。計算未知實例與所有已知實例的距離。(一般采用歐氏距離)選擇最近K個已知實例。根據少數服從多數的投票法則,讓未知實例歸類為K個最近鄰樣本中最多數的類…

音視頻FAQ(三):音畫不同步

摘要 本文介紹了音畫不同步問題的五個因素:編碼和封裝階段、網絡傳輸階段、播放器中的處理階段、源內容產生的問題以及轉碼和編輯。針對這些因素,提出了相應的解決方案,如使用標準化工具、選擇強大的傳輸協議、自適應緩沖等。此外&#xff0…

uniapp微信小程序區分正式版,開發版,體驗版

小程序代碼區分是正式版,開發版,還是體驗版 通常正式和開發環境需要調用不同域名接口,發布時需要手動更換 或者有些東西不想在正式版顯示,只在開發版體驗版中顯示,也需要去手動隱藏 官方沒有明確給出判斷環境的方法&a…

SciencePub學術 | CCF推薦重點計算機SCIE征稿中

SciencePub學術 刊源推薦: CCF推薦重點計算機SCIE征稿中!信息如下,錄滿為止: 一、期刊概況: CCF推薦重點SCIE簡介 【期刊簡介】IF:4.0,JCR2區,中科院3區; 【版面類型】正刊&#…

Swift 基礎

工程目錄 請點擊下面工程名稱,跳轉到代碼的倉庫頁面,將工程 下載下來 Demo Code 里有詳細的注釋 點擊下載代碼:swift-01

記錄一下基于jeecg-boot3.0的待辦消息移植記錄

因為之前沒有記錄,所以還要看代碼進行尋找,比較費勁,所以今天記錄一下: 1、后端 SysAnnouncementController 下面函數增加待辦的幾個顯示內容給前端用 具體代碼如下: /*** 功能:補充用戶數據&#xff0c…

由小波變換模極大值重建信號

給定信號, 令小波變換的尺度 則x(t)的二進小波變換為 令為取模極大值時的橫坐標,那么就是模極大值。 目標是由坐標、模極大值及最后一級的低頻分量重建信號x(t) 為了重建x(t),假定有一信號集合h(t),該集合中信號的小波變換和x(…

打印出二進制的奇數位和偶數位

void print(int a) {int i0;printf("奇數位:");for(i30;i>0;i-2){printf("%d ",(a>>i)&1);}printf("\n");printf("偶數位:");for(i31;i>1;i-2){printf("%d ",(a>>i)&1);} …

人臉圖像處理

1,人臉圖像與特征基礎 人臉圖像的特點 規律性: 人的兩只眼睛總是對稱分布在人臉的上半部分,鼻子和嘴唇中心點的連線基本與兩眼之間的連線垂直,嘴絕對不會超過眼鏡的兩端點(雙眼為d,則雙眼到嘴巴的垂直距離一般在0.8-1.25) 唯一性 非侵擾與便利性 可擴展性 人臉圖像的應用 身份…

Linux MQTT智能家居(溫度,濕度,環境監測,攝像頭等界面布局設置)

文章目錄 前言一、溫度濕度曲線布局二、環境監測界面布局三、攝像頭界面布局總結 前言 本篇文章來完成另外三個界面的布局設置。 這里會使用到 feiyangqingyun的一些控件庫。 一、溫度濕度曲線布局 TempHumtiy.h: #ifndef TEMPHUMTIY_H #define TEMPHUMTIY_H#include <…

pprof 三把刀

pprof 三把刀 看內存 go tool pprof http://127.0.0.1:6060/debug/pprof/heap?seconds30 看cpu go tool pprof http://127.0.0.1:6060/debug/pprof/profile?seconds30 看協程 go tool pprof http://localhost:6060/debug/pprof/goroutine 端口是自定義的&#xff0c;看看…

Golang原生實現JA3指紋修改,并支持Proxy代理

起因 抓取某個HTTPS網站的時候 開啟charles代理能夠抓取成功,關閉被風控 通過檢測,懷疑可能是tls的時候有區別 嘗試 golang的http中,Transport.TLSClientConfig是可以自定義設置的 但起初通過隨意設置并不能繞過風控 困難 使用golang的http客戶端,修改DialTLSContext函數的…

使用Python批量將Word文件轉為PDF文件

說明&#xff1a;在使用Minio服務器時&#xff0c;無法對word文件預覽&#xff0c;如果有需要的話&#xff0c;可以將word文件轉為pdf文件&#xff0c;再存儲到Minio中&#xff0c;本文介紹如何批量將word文件&#xff0c;轉為pdf格式的文件&#xff1b; 安裝庫 首先&#xff…

神經網絡基礎-神經網絡補充概念-12-向量化邏輯回歸的梯度輸出

代碼實現 import numpy as npdef sigmoid(z):return 1 / (1 np.exp(-z))def compute_loss(X, y, theta):m len(y)h sigmoid(X.dot(theta))loss (-1/m) * np.sum(y * np.log(h) (1 - y) * np.log(1 - h))return lossdef compute_gradient(X, y, theta):m len(y)h sigmoi…