鏈表逆序用哨兵位頭節點

在C語言中實現鏈表的逆序,使用哨兵頭節點是一種常見的做法。哨兵頭節點可以簡化代碼邏輯,特別是當鏈表為空時,可以避免空指針異常。下面是一個使用哨兵頭節點逆序單鏈表的C語言實現

示例:

#include <stdio.h>
#include <stdlib.h>// 定義鏈表節點結構體
typedef struct ListNode {int val;struct ListNode *next;
} ListNode;// 創建新節點
ListNode* createNode(int value) {ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));if (!newNode) {exit(-1); // 分配內存失敗,退出程序}newNode->val = value;newNode->next = NULL;return newNode;
}// 逆序鏈表,使用哨兵頭節點
void reverseList(ListNode** headRef) {ListNode* prev = NULL;ListNode* current = *headRef;ListNode* next = NULL;while (current != NULL) {next = current->next;  // 保存下一個節點current->next = prev;  // 當前節點指向前一個節點,實現逆序prev = current;        // 前一個節點移動到當前節點current = next;        // 當前節點移動到下一個節點}*headRef = prev;  // 更新頭節點
}// 打印鏈表
void printList(ListNode* head) {ListNode* temp = head;while (temp != NULL) {printf("%d ", temp->val);temp = temp->next;}printf("\n");
}// 主函數,測試逆序鏈表功能
int main() {ListNode* head = createNode(1);head->next = createNode(2);head->next->next = createNode(3);head->next->next->next = createNode(4);printf("原始鏈表:");printList(head);reverseList(&head);printf("逆序后鏈表:");printList(head);// 釋放鏈表內存ListNode* temp;while (head != NULL) {temp = head;head = head->next;free(temp);}return 0;
}

在這個代碼中,我們首先定義了鏈表節點的結構體ListNode,然后提供了創建新節點的函數createNodereverseList函數用來逆序鏈表,它使用了一個哨兵頭節點,即第一個節點作為prev指針的初始位置,最后將頭節點更新為prev指針所指向的節點。printList函數用來打印鏈表的節點值。

main函數中,我們創建了一個簡單的鏈表,并調用reverseList函數進行逆序,然后打印出逆序后的結果。最后,我們釋放了鏈表占用的內存。

請注意,在實際的項目開發中,還需要對代碼進行適當的錯誤處理和邊界條件檢查,以確保程序的健壯性。

在C語言中,使用哨兵位頭節點(dummy head)來逆序鏈表是一種常見的技巧,因為它可以簡化邊界條件的處理。以下是一個使用哨兵位頭節點逆序單鏈表的示例代碼:

// 鏈表節點的結構體定義

typedef struct ListNode {int val;struct ListNode *next;
} ListNode;

// 創建一個新的鏈表節點

ListNode* createNode(int value) {ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));if (!newNode) {exit(-1); // 分配內存失敗,退出程序}newNode->val = value;newNode->next = NULL;return newNode;
}

// 在鏈表的末尾添加一個新節點

void appendNode(ListNode** headRef, int value) {ListNode* newNode = createNode(value);ListNode* temp = *headRef;if (temp == NULL) {*headRef = newNode;return;}while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;
}

// 逆序鏈表,使用哨兵位頭節點

void reverseList(ListNode** headRef) {ListNode* prev = NULL;ListNode* current = *headRef;ListNode* next = NULL;while (current != NULL) {next = current->next;  // 保存下一個節點current->next = prev;  // 當前節點指向前一個節點prev = current;        // 前一個節點移動到當前節點current = next;        // 當前節點移動到下一個節點}*headRef = prev;  // 更新頭節點
}

// 打印鏈表

void printList(ListNode* head) {ListNode* temp = head;while (temp != NULL) {printf("%d ", temp->val);temp = temp->next;}printf("\n");
}

// 主函數,測試逆序鏈表功能

int main() {ListNode* head = NULL; // 哨兵位頭節點// 向鏈表中添加元素appendNode(&head, 1);appendNode(&head, 2);appendNode(&head, 3);appendNode(&head, 4);printf("原始鏈表:");printList(head);// 逆序鏈表reverseList(&head);printf("逆序后鏈表:");printList(head);// 釋放鏈表內存ListNode* temp;while (head != NULL) {temp = head;head = head->next;free(temp);}return 0;
}

總代碼

#include <stdio.h>
#include <stdlib.h>// 鏈表節點的結構體定義
typedef struct ListNode {int val;struct ListNode *next;
} ListNode;// 創建一個新的鏈表節點
ListNode* createNode(int value) {ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));if (!newNode) {exit(-1); // 分配內存失敗,退出程序}newNode->val = value;newNode->next = NULL;return newNode;
}// 在鏈表的末尾添加一個新節點
void appendNode(ListNode** headRef, int value) {ListNode* newNode = createNode(value);ListNode* temp = *headRef;if (temp == NULL) {*headRef = newNode;return;}while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;
}// 逆序鏈表,使用哨兵位頭節點
void reverseList(ListNode** headRef) {ListNode* prev = NULL;ListNode* current = *headRef;ListNode* next = NULL;while (current != NULL) {next = current->next;  // 保存下一個節點current->next = prev;  // 當前節點指向前一個節點prev = current;        // 前一個節點移動到當前節點current = next;        // 當前節點移動到下一個節點}*headRef = prev;  // 更新頭節點
}// 打印鏈表
void printList(ListNode* head) {ListNode* temp = head;while (temp != NULL) {printf("%d ", temp->val);temp = temp->next;}printf("\n");
}// 主函數,測試逆序鏈表功能
int main() {ListNode* head = NULL; // 哨兵位頭節點// 向鏈表中添加元素appendNode(&head, 1);appendNode(&head, 2);appendNode(&head, 3);appendNode(&head, 4);printf("原始鏈表:");printList(head);// 逆序鏈表reverseList(&head);printf("逆序后鏈表:");printList(head);// 釋放鏈表內存ListNode* temp;while (head != NULL) {temp = head;head = head->next;free(temp);}return 0;
}

在這個代碼中,我們首先定義了鏈表節點的結構體ListNode。然后,我們提供了創建新節點和向鏈表末尾添加新節點的函數createNodeappendNodereverseList函數用來逆序鏈表,它使用了一個哨兵頭節點prev,并最終將頭節點更新為prev指針所指向的節點。printList函數用來打印鏈表的節點值。

main函數中,我們創建了一個鏈表,并調用reverseList函數進行逆序,然后打印出逆序后的結果。最后,我們釋放了鏈表占用的內存。

請注意,在實際的項目開發中,還需要對代碼進行適當的錯誤處理和邊界條件檢查,以確保程序的健壯性。

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

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

相關文章

富格林:應用正規技巧阻撓被騙

富格林悉知&#xff0c;隨著如今入市現貨黃金的朋友愈來愈多&#xff0c;不少投資者也慢慢開始重視起提高自身的正規投資技巧&#xff0c;希望能阻撓被騙更高效地在市場上獲利。雖然目前黃金市場存在一定的受害風險&#xff0c;但只要投資者嚴格按照正規的交易規則來做單&#…

python解決flask啟動的同時啟動定時任務

業務場景描述&#xff1a;在常規的開發中&#xff0c;我們開發接口服務&#xff0c;一般會將數據放在數據庫、文件等第三方文件&#xff0c;啟動服務后&#xff0c;服務到后臺數據庫中加載數據&#xff0c;這樣做的好處當然是開發會更加便利以及數據的可復用性較高&#xff0c;…

深度學習-03-函數的連續調用

深度學習-03-函數的連續調用 本文是《深度學習入門2-自製框架》 的學習筆記&#xff0c;記錄自己學習心得&#xff0c;以及對重點知識的理解。如果內容對你有幫助&#xff0c;請支持正版&#xff0c;去購買正版書籍&#xff0c;支持正版書籍不僅是尊重作者的辛勤勞動&#xff0…

LLaMA-Factory推理實踐

運行成功的記錄 平臺&#xff1a;帶有GPU的服務器 運行的命令 git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory/ conda create -n py310 python3.10 conda activate py310由于服務器不能直接從huggingface上下載Qwen1.5-0.5B&#xff0c;但本地可…

51仿真器 PZ-51Tracker 未知設備

插上仿真器&#xff0c;右擊我的電腦 等待一下&#xff0c;選擇winUSB 此時在keil中選擇仿真器會報錯&#xff0c;需要安裝如下我是win10) 安裝好后退出再試&#xff0c;沒有報錯即可 這項也要選擇 另外配置晶振

MYSQL之存儲篇

MYSQL之存儲篇 存儲過程簡介存儲過程優點&#xff1a; MySQL的存儲過程MySQL存儲過程的創建1.格式2.聲明分割符3.參數4.變量5.注釋6.MySQL存儲過程的調用7. MySQL存儲過程的查詢8.MySQL存儲過程的修改9.MySQL存儲過程的刪除10. MySQL存儲過程的控制語句11.MySQL存儲過程的基本函…

mybatis配置環境流程

mybatis配置環境流程 為啥要用mybatis&#xff1a;通過Mybatis實現快速訪問后端pgsql、mysql等數據庫。 1.修改pom.xml&#xff0c;添加mybatis相關依賴 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-s…

React + SpringBoot開發用戶中心管理系統

用戶中心項目搭建筆記 技術棧 前端技術棧 “react”: “^18.2.0”,ant-design-pro 后端技術棧 SpringBoot 2.6.x 項目源碼地址 https://gitee.com/szxio/user-center 前端項目搭建 快速搭建一個后端管理系統項目框架 初始化 antDesignPro 官網&#xff1a; https://…

Spel表達式使用案例

package com.example.demo.api;import com.example.demo.model.User; import lombok.extern.slf4j.Slf4j;<

CSS Web前端框架:深入剖析與應用實踐

CSS Web前端框架&#xff1a;深入剖析與應用實踐 在快速發展的Web技術領域&#xff0c;CSS Web前端框架已成為構建現代化、高效且響應式網頁的關鍵工具。它們不僅簡化了開發過程&#xff0c;還提高了代碼的可維護性和復用性。然而&#xff0c;面對眾多紛繁復雜的框架選擇&…

ByteBuddy字節碼增強器

Byte Buddy是java的字節碼增強器&#xff0c;一個優雅的運行時java代碼生成庫&#xff0c;使用時需要慎重 文檔地址&#xff1a;http://bytebuddy.net/#/tutorial-cn 1. 引入ByteBuddy <!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy --><depend…

LeetCode---哈希表

242. 有效的字母異位詞 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出現的次數都相同&#xff0c;則稱 s 和 t 互為字母異位詞。 代碼示例&#xff1a; //時間復雜度: O(n) //空間復雜度: O(1) c…

Java生成PDF筆記整理

引入依賴, groupId:com.itextpdf, version:8.0.4, artifactId如下kernel,io,layout,forms創建pdf對象try(ByteArrayOutputStream outputStream new ByteArrayOutputStream()){PdfWriter writer new PdfWriter(outputStream, new WriterProperties().setFullCompressionMode(t…

離線安裝python庫

1. 下載安裝包 在聯網機器上安裝 # 選擇符合目標架構的版本&#xff0c;主要是libc版本和python版本 pip download --platformmanylinux2010_x86_64 --only-binary:all: --python-version3.7.4 tabulate # 或者 pip download --platformmanylinux_2_5_x86_64 --only-binary:a…

do...while循環

基本語法 while循環&#xff0c;是先判斷條件再執行。 do...while循環&#xff0c;是先斬后奏&#xff0c;先至少執行一次循環語句塊中的邏輯&#xff0c;再判斷是否繼續。 do {//do while 循環語句塊; } while (bool類型的值);注意&#xff1a;do...while語句&#xff0c;存…

Common Lisp筆記

在計劃學習函數式編程的時候&#xff0c;我一開始打算學習的是 F#。因為我朋友就是在 DTU 上的學&#xff0c;F# 就是 DTU&#xff08;丹麥理工&#xff09;開發的。但是由于 F# 和微軟的 .NET 綁定&#xff0c;而在 macOS 上&#xff0c;目前版本的 .NET 的是有些問題的&#…

2020編程語言排序:探索編程界的熱門與趨勢

2020編程語言排序&#xff1a;探索編程界的熱門與趨勢 在數字時代的浪潮中&#xff0c;編程語言作為構建數字世界的基石&#xff0c;其流行度和影響力不容忽視。2020年&#xff0c;各大編程語言在各自的領域里展現出獨特的魅力和實力。本文將從四個方面、五個方面、六個方面和…

線性代數|機器學習-P3乘法和因式分解矩陣

文章目錄 1. 矩陣分解2. S Q Λ Q T SQ\Lambda Q^T SQΛQT3. A U Σ V T AU\Sigma V^T AUΣVT4. A LU 分解5. 矩陣的四個子空間 1. 矩陣分解 目前我們有很多重要的矩陣分解&#xff0c;每個分解對應于多個前提條件&#xff0c;分解方法&#xff0c;分解后的形狀會中如下&…

【Vue】v-for中的key

文章目錄 一、引入問題二、分析問題 一、引入問題 語法&#xff1a; key屬性 "唯一值" 作用&#xff1a;給列表項添加的唯一標識。便于Vue進行列表項的正確排序復用。 為什么加key&#xff1a;Vue 的默認行為會嘗試原地修改元素&#xff08;就地復用&#xff09;…

馬寶國和沈有容-UMLChina建模知識競賽第5賽季第12輪

DDD領域驅動設計批評文集 做強化自測題獲得“軟件方法建模師”稱號 《軟件方法》各章合集 參考潘加宇在《軟件方法》和UMLChina公眾號文章中發表的內容作答。在本文下留言回答。 只要最先答對前3題&#xff0c;即可獲得本輪優勝。 如果有第4題&#xff0c;第4題為附加題&am…