算法競賽階段二-數據結構(37)數據結構循環鏈表模擬實現

之前單鏈表中,數組全初始化為0,末尾最后一個next 存的就是0,指向的就是頭節點

循環鏈表的基本概念

循環鏈表是一種特殊的鏈表,其尾節點的指針域指向頭節點,形成一個閉環。與普通單鏈表相比,循環鏈表的遍歷需要額外注意終止條件,避免無限循環。


循環鏈表的節點結構

循環鏈表的節點與普通鏈表節點相同,包含數據域和指針域。以C語言為例:

typedef struct Node {int data;           // 數據域struct Node *next;  // 指針域,指向下一個節點
} Node;


循環鏈表的初始化

初始化時,頭節點的指針域指向自身,形成空循環鏈表:

Node* initList() {Node *head = (Node*)malloc(sizeof(Node));if (head != NULL) {head->next = head;  // 頭節點指向自身}return head;
}


循環鏈表的插入操作

頭插法

新節點插入到頭節點之后:

void insertAtHead(Node *head, int data) {Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head->next;head->next = newNode;
}

尾插法

新節點插入到尾節點之后(需先遍歷到尾節點):

void insertAtTail(Node *head, int data) {Node *current = head;while (current->next != head) {current = current->next;}Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head;current->next = newNode;
}


循環鏈表的刪除操作

刪除指定值的節點:

void deleteNode(Node *head, int data) {Node *current = head;while (current->next != head) {if (current->next->data == data) {Node *temp = current->next;current->next = temp->next;free(temp);return;}current = current->next;}
}


循環鏈表的遍歷

遍歷時需檢查是否回到頭節點:

void traverseList(Node *head) {Node *current = head->next;while (current != head) {printf("%d ", current->data);current = current->next;}printf("\n");
}


循環鏈表的銷毀

釋放所有節點內存,避免內存泄漏:

void destroyList(Node *head) {Node *current = head->next;while (current != head) {Node *temp = current;current = current->next;free(temp);}free(head);
}


注意事項

  1. 終止條件:循環鏈表的遍歷和操作需明確終止條件(如current != head),否則會陷入無限循環。
  2. 邊界處理:空鏈表時需確保頭節點指向自身。
  3. 內存管理:動態分配的內存需及時釋放。

通過上述方法,可以完整實現循環鏈表的基本操作。

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

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

相關文章

20250727讓飛凌OK3576-C開發板在Rockchip的原廠Android14下通過耳機播音

20250727讓飛凌OK3576-C開發板在Rockchip的原廠Android14下通過耳機播音 2025/7/27 23:28緣起:很容易知道 飛凌OK3576-C開發板 使用的聲卡芯片是 NAU88C22YG 新唐科技(NUVOTON) NAU8822LYG NAU88C22YG 新唐立體聲音頻編解碼芯片原理圖:OK3576-C V1.2_202…

正向代理和反向代理的理解

**正向代理(Forward Proxy)和反向代理(Reverse Proxy)**是兩種不同類型的代理服務器,它們在數據傳輸過程中扮演的角色、使用場景以及工作方式都有所不同。 正向代理(Forward Proxy) 定義與作用&…

Java 后端 Cookie Session Token會話跟蹤技術

概述 會話從字面理解就是"兩方交流",那問題就來了,HTTP(超文本傳輸協議)里面的"傳輸"不就包含了"兩方交流"的意思嗎?為什么要多此一舉提出會話技術呢? 談到這個,…

智譜AI GLM大模型 GLM-4-Plus的快速使用 ChatOpenAI類來調用GLM-4模型

智譜AIGLM-4,2024年1月16日發布的第四代基座大模型,其整體性能相較前代提升近60%,多維度指標逼近OpenAI的GPT-4水平。該模型支持128K上下文窗口(約300頁文本處理能力),在長文本信息處理中實現100%精度召回。…

AsyncLocal淺復制的問題解決方案

針對C#中AsyncLocal<T>淺復制問題&#xff0c;以下是幾種主要的解決方案&#xff1a; 1. 使用不可變對象&#xff08;推薦&#xff09; 將存儲在AsyncLocal<T>中的對象設計為不可變的&#xff0c;避免修改共享狀態&#xff1a; public class ImmutableUserContext …

IIS發布.NET9 API 常見報錯匯總

記錄工作過程中發現的IIS常見錯誤。 1. HTTP Error 500.19 - Internal Server Error .NET 9 API --》vs打包方式如下&#xff1a; 發布到IIS后報錯HTTP Error 500.19 - Internal Server Error。 解決方案&#xff1a; 下載ASP.NET Core Hosting Bundle&#xff08;ASP.NET Co…

Google Chrome V8< 13.7.120 沙箱繞過漏洞

【嚴重】Google Chrome V8< 13.7.120 沙箱繞過漏洞 漏洞描述 V8 是 Google 開發的一款開源高性能 JavaScript 和 WebAssembly 引擎&#xff0c;廣泛用于 Chrome 瀏覽器和 Node.js 等項目中。 受影響版本中&#xff0c;JsonParser::MakeString 函數在處理長度為 1 的轉義字…

基于Spring Boot和Vue電腦維修平臺整合系統的設計與實現

用戶&#xff1a;注冊&#xff0c;登錄&#xff0c;在線報修&#xff0c;維修接單&#xff0c;維修報告&#xff0c;維修評價&#xff0c;個人資料維修工&#xff1a;登錄&#xff0c;在線報修&#xff0c;維修接單&#xff0c;維修報告&#xff0c;維修評價&#xff0c;通知公…

InsightFace(RetinaFace + ArcFace)人臉識別項目(預訓練模型,魯棒性很好)

背景介紹 這是一個 簡單的人臉識別項目&#xff0c;用 FastApi 在本地實現&#xff0c;使用預訓練模型&#xff0c;直接可用。 新方案比之前的FaceNet強太多了&#xff0c;甚至不用數據增強等操作&#xff0c;就可以識別戴眼鏡、不戴眼鏡、歪著的人臉等。 充分證明了選型的重要…

App Inventor 2 使用 MaterialIcons 圖標字體,快捷展示專業圖標

平時布局的話&#xff0c;如果要使用圖標&#xff0c;一般需要去找 png 圖片&#xff0c;且透明背景的。如果需要根據不同常見圖標進行變色的話&#xff0c;就需要準備多張不同樣式的圖標&#xff0c;還要考慮圖片的分辨率等等因素&#xff0c;非常的麻煩。 這時&#xff0c;如…

C語言——關于指針(逐漸清晰版)

為了更好地理解本篇文章的知識內容&#xff0c;讀者可以將以下文章作為補充知識進行閱讀 &#xff1a; C語言————原碼 補碼 反碼 &#xff08;超絕詳細解釋&#xff09;-CSDN博客 C語言————二、八、十、十六進制的相互轉換-CSDN博客 C語言————斐波那契數列的理解…

SVG 在線編輯器

SVG 在線編輯器 引言 隨著互聯網技術的發展&#xff0c;矢量圖形在網頁設計和數據可視化中扮演著越來越重要的角色。SVG&#xff08;可縮放矢量圖形&#xff09;因其文件小、無限縮放不模糊的特性&#xff0c;成為了網頁設計中常用的圖形格式。SVG 在線編輯器的出現&#xff0c…

libpostproc 已經從 ffmpeg 中移除,導致編譯 ffmpeg 時沒有 libpostproc

今天編譯 ffmpeg 時突然發現 libpostproc 不見了&#xff0c;-enable-postproc 也變成了非法的選項。用搜索引擎搜索相關信息找不到一點&#xff0c;于是去 github 看。 從提交記錄可以看到 libpostproc 已經被移除了 鏈接 主線中已經看不到了 libpostproc 這個目錄了

基于 Dell PowerEdge T440 搭建的 Proxmox VE 配置 RTX 3060 顯卡直通虛擬機、切換直通

基于 Dell PowerEdge T440 搭建的 Proxmox VE 配置 RTX 3060 顯卡直通虛擬機、切換直通 文章目錄 基于 Dell PowerEdge T440 搭建的 Proxmox VE 配置 RTX 3060 顯卡直通虛擬機、切換直通 1. 前言 2. 前提條件 3. 配置步驟 3.1. 啟用 VT-d 3.2. 激活 IOMMU 3.3. 添加 VFIO 模塊 …

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘voila’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘voila’問題 摘要 在開發過程中&#xff0c;我們常常會遇到pip安裝包時出現各種錯誤&#xff0c;特別是在使用PyCharm進行開發時。本文將詳細介紹如何解決安裝…

[spring6: @EnableWebMvc]-源碼分析

源碼 EnableWebMvc EnableWebMvc 是用于啟用 Spring MVC 的注解&#xff0c;它通過導入 DelegatingWebMvcConfiguration 來加載默認的 MVC 配置&#xff0c;同時允許開發者通過實現 WebMvcConfigurer 接口來自定義部分配置&#xff1b;若需更高階的控制&#xff0c;則可直接繼承…

Jmeter的元件使用介紹:(四)前置處理器詳解

Jmeter的前置處理器可以用來在取樣器執行前做一些數據準備操作&#xff0c;也需要注意使用的作用域問題。常用的前置處理器有&#xff1a;用戶參數、BeanShell預處理器、JDBC預處理器。一、用戶參數 【用戶參數】與前面介紹過的【用戶定義的變量】有相似之處&#xff0c;先來介…

十七、K8s 可觀測性:全鏈路追蹤

十七、K8s 可觀測性&#xff1a;全鏈路追蹤 文章目錄十七、K8s 可觀測性&#xff1a;全鏈路追蹤1、Skywalking 初識1.1 為什么需要全鏈路追蹤平臺1.2 全鏈路追蹤核心組件及工作原理1.2.1 全鏈路追蹤核心概念1.2.2 全鏈路追蹤工作原理1.3 什么是Skywalking&#xff1f;1.4 Skywa…

2025 Gitee vs. GitLab:全面對比與選擇指南

在軟件研發持續加速、合規要求日益嚴格的背景下&#xff0c;選擇合適的代碼托管平臺成為團隊數字化能力建設的關鍵環節。尤其在中國本土市場&#xff0c;Gitee正憑借其深度本地化能力、全面生態整合和開源社區支撐&#xff0c;成為國內團隊首選的開發協作平臺。 一、Gitee&…

期貨反向跟單忌諱問題(一): 不斷調整盤手交易規則

在期貨反向跟單領域&#xff0c;不少運營者在摸著石頭過河的過程中&#xff0c;容易陷入一個致命誤區——對盤手交易規則的頻繁調整。這種看似“優化策略”的舉動&#xff0c;往往會讓整個跟單體系陷入惡性循環&#xff0c;最終偏離盈利初衷。期貨反向跟單的核心邏輯是&#xf…