LeetCode 24反轉鏈表

單鏈表反轉:詳細解析與代碼實現

在數據結構的學習過程中,鏈表是一個非常重要且有趣的部分,而單鏈表的反轉操作更是常考的基礎知識點。今天就來和大家詳細講講如何實現單鏈表的反轉,并通過代碼示例來加深理解呀。

題目

給定單鏈表的頭節點?head?,請反轉鏈表,并返回反轉后的鏈表的頭節點。

思路分析

要反轉單鏈表,核心思路就是改變鏈表節點中指針的指向方向。我們可以想象成把原來依次相連的節點,逐個 “掉頭”,讓它們按照相反的順序重新連接起來。

為了實現這個過程,我們采用迭代的方法,借助幾個指針來幫忙操作:

  1. prev 指針:這個指針一開始初始化為?NULL,它的作用是始終指向當前節點的前一個節點。在反轉的過程中,它相當于一個 “錨點”,讓當前節點能夠指向它,從而改變鏈表的連接方向。
  2. curr 指針:初始化為鏈表的頭節點?head,它代表著我們當前正在處理的節點。在每一輪循環中,我們都會對這個節點進行操作,改變它的?next?指針指向。
  3. nextTemp 指針:它用于臨時保存當前節點的下一個節點。為什么要這么做呢?因為一旦我們改變了當前節點?curr?的?next?指針指向(讓它指向?prev),如果不提前保存下一個節點的信息,那就會丟失后續鏈表的連接情況,導致鏈表斷裂呀。

整個反轉過程就是通過不斷地循環,在每一輪循環中完成以下幾個關鍵步驟:

  • 首先,使用?nextTemp?保存?curr?節點的下一個節點,也就是執行?nextTemp = curr->next;?這一步,確保后續鏈表不會丟失。
  • 接著,把當前節點?curr?的?next?指針指向它前面的節點?prev,即?curr->next = prev;,這一步就是真正改變鏈表連接方向,實現 “反轉” 的關鍵操作哦。
  • 然后,更新?prev?指針,讓它指向當前節點?curr,執行?prev = curr;,為下一輪循環做準備,因為下一輪循環中,當前節點就變成了之前保存的?nextTemp?所指向的節點了,而此時的?prev?就要相應跟上呀。
  • 最后,更新?curr?指針,讓它指向之前保存的下一個節點?nextTemp,也就是?curr = nextTemp;,這樣就可以進入下一輪循環,繼續處理鏈表中的下一個節點啦。

當循環結束,也就是?curr?遍歷到原鏈表的末尾(即?curr?變為?NULL)時,prev?指針就正好指向了反轉后鏈表的頭節點啦,我們最后返回這個?prev?就大功告成咯。

代碼實現

下面就是使用 C 語言實現單鏈表反轉的完整代碼啦:

#include <stdio.h>
#include <stdlib.h>// 單鏈表節點結構體定義
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode {int val;struct ListNode *next;
};// 創建單鏈表節點的函數
struct ListNode* createNode(int val) {struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));if (newNode == NULL) {printf("內存分配失敗!\n");return NULL;}newNode->val = val;newNode->next = NULL;return newNode;
}// 向鏈表末尾插入節點的函數
void insertNode(struct ListNode** head, int val) {struct ListNode* newNode = createNode(val);if (*head == NULL) {*head = newNode;} else {struct ListNode* temp = *head;while (temp->next!= NULL) {temp = temp->next;}temp->next = newNode;}
}// 打印單鏈表的函數
void printList(struct ListNode* head) {struct ListNode* temp = head;while (temp!= NULL) {printf("%d ", temp->val);temp = temp->next;}printf("\n");
}// 反轉單鏈表的函數
struct ListNode* reverseList(struct ListNode* head) {if (head == NULL) {return head;}struct ListNode *prev = NULL;struct ListNode *curr = head;struct ListNode *nextTemp;while (curr!= NULL) {nextTemp = curr->next;curr->next = prev;prev = curr;curr = nextTemp;}return prev;
}int main() {struct ListNode* head = NULL;// 構建一個簡單的單鏈表,例如1 -> 2 -> 3 -> 4 -> 5insertNode(&head, 1);insertNode(&head, 2);insertNode(&head, 3);insertNode(&head, 4);insertNode(&head, 5);printf("原單鏈表為: ");printList(head);struct ListNode* reversedHead = reverseList(head);printf("反轉后的單鏈表為: ");printList(reversedHead);return 0;
}

?

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

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

相關文章

Redis學習筆記之——學習計劃

Redis——Remote Dictionary Server&#xff0c;開源、基于內存、速度快、key-value... Redis做為一個高性能的鍵值存儲系統&#xff0c;廣泛應用于緩存、會話存儲、分布式鎖以及其他需要快速訪問的數據場景中。熟悉掌握redis&#xff0c;似乎已成為廣大碼農們必備的一項技能。…

網絡安全教學博客(二):常見網絡安全威脅剖析

在上一篇博客中&#xff0c;我們了解了網絡安全的基礎概念和重要性。今天&#xff0c;讓我們深入探討一下常見的網絡安全威脅&#xff0c;以便我們能夠更好地識別和防范它們。 惡意軟件&#xff08;Malware&#xff09; 病毒&#xff08;Virus&#xff09;&#xff1a;病毒是一…

Vue3狀態管理:Pinia架構設計分析

Vue3狀態管理:Pinia架構設計分析 介紹 在Vue.js開發中&#xff0c;狀態管理是一個非常重要的部分。隨著Vue3的發布&#xff0c;Pinia作為一種新的狀態管理架構也相繼問世。本文將對Pinia架構進行深入分析&#xff0c;幫助讀者了解其設計原理、特點以及在實際項目中的應用。 架構…

【IDEA】啟動報錯

今天啟動IDEA報錯 報錯信息&#xff1a; Cannot connect to already running IDE instance. Exception: Process 5,444 is still running 打開任務管理器&#xff0c;關掉進程ID5444的任務

socket編程UDP-實現停等機制(接收確認、超時重傳)

在下面博客中&#xff0c;我介紹了利用UDP模擬TCP連接、按數據包發送文件的過程&#xff0c;并附上完整源碼。 socket編程UDP-文件傳輸&模擬TCP建立連接脫離連接&#xff08;進階篇&#xff09;_udp socket發送-CSDN博客 下面博客實現的是滑動窗口機制&#xff1a; sock…

uniapp小程序的錨點定位(將頁面滾動到目標位置)

小程序中&#xff0c;a頁面跳轉到b頁面&#xff0c;跳轉后滾動定位到b頁面的特定位置。 1.uni.pageScrollTo傳遞一個scrollTop參數可以滾動到特定位置。2.可以通過 uni.createSelectorQuery()等獲取定位元素的位置信息。3.uni.getSystemInfoSync()獲取設備的導航欄和狀態欄高度…

php基礎:命名空間

1.PHP 命名空間可以解決以下兩類問題&#xff1a; 1.用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。 2.為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名&#xff08;或簡短&#xff09;的名稱&#xff0c;以提高源代碼的可讀…

分布式 CAP理論 總結

前言 相關系列 《分布式 & 目錄》《分布式 & CAP理論 & 總結》《分布式 & CAP理論 & 問題》 分布式 分布式的核心是將大型業務拆解成多個子業務以使之在不同的機器上執行。分布式是用于解決單個物理機容量&性能瓶頸問題而采用的優化手段&#xf…

python xpath解析筆記

與bs4的區別 bs4有很多屬性和方法&#xff0c;而xpath只有一個方法&#xff0c;是通過不同的xpath表達式實現很多功能的。 html例子 定位 tree.xpath(‘/html/head/title’) 返回列表。 開頭的斜杠表示從根節點遍歷。 中間的斜杠表示層級。&#xff08;相當于bs4中的>…

Q學習(Q-Learning)詳解

?作者簡介&#xff1a;2022年博客新星 第八。熱愛國學的Java后端開發者&#xff0c;修心和技術同步精進。 &#x1f34e;個人主頁&#xff1a;Java Fans的博客 &#x1f34a;個人信條&#xff1a;不遷怒&#xff0c;不貳過。小知識&#xff0c;大智慧。 &#x1f49e;當前專欄…

樹狀數組詳解

概述 樹狀數組&#xff08;Binary Indexed Tree&#xff0c;簡稱BIT&#xff09;&#xff0c;是一種數據結構&#xff0c;用于處理區間查詢和更新問題。它是一種可以高效地在對數級別時間復雜度內進行單點更新和區間查詢的數據結構。樹狀數組通常用于解決以下兩類問題&#xf…

freeswitch(開啟支持MCU視頻會議,使用mod_av模塊)

親測版本centos 7.9系統–》 freeswitch1.10.9 本人freeswitch安裝路徑(根據自己的路徑進入) /usr/local/freeswitch/etc/freeswitch場景說明: 有些場景想使用視頻會議MCU融合畫面進行開會使用方法: 第一步:下載插件 yum install -y epel-release yum install

【大數據技術基礎】【記錄Ubuntu 16.04升級到18.04】Ubuntu的一個版本升級到另一個版本

在 Ubuntu 操作系統中進行軟件更新和系統升級 Ubuntu Kylin 16.04 LTS 系統進行系統升級到 Ubuntu 18.04.6 LTS 版本 升級提示&#xff1a;系統彈出提示框&#xff0c;告知用戶有新版本的 Ubuntu 可用&#xff0c;詢問用戶是否想要升級。 認證窗口&#xff1a;顯示了一個認證…

這是一個vue3 + scss的數字滾動效果

介紹: 當數字變化時&#xff0c;只改變變化的數字位&#xff0c;其余的不變&#xff0c;可以遞增、遞減、驟變、負數也可以&#xff0c;但是樣式要根據具體的項目需求去改&#xff1b; 效果1、增加數字&#xff1a; 效果2、減少數字&#xff1a; 使用方法&#xff1a; <te…

TortoiseGit的下載、安裝和配置

一、TortoiseGit的簡介 tortoiseGit是一個開放的git版本控制系統的源客戶端&#xff0c;支持Winxp/vista/win7.該軟件功能和git一樣 不同的是&#xff1a;git是命令行操作模式&#xff0c;tortoiseGit界面化操作模式&#xff0c;不用記git相關命令就可以直接操作&#xff0c;讀…

最新版Chrome瀏覽器加載ActiveX控件之Adobe PDF閱讀器控件

背景 Adobe PDF閱讀器控件是一個ActiveX控件&#xff0c;用于在Windows平臺上顯示和操作PDF文件。它提供了一系列方法和屬性&#xff0c;可以實現對PDF文件的加載、顯示、搜索、打印、保存等操作。 allWebPlugin中間件是一款為用戶提供安全、可靠、便捷的瀏覽器插件服務的中間件…

linux在沒網的情況下如何校驗時間 超詳細拿來即用

一、沒有校時服務器的話 1、手動修改 sudo date --set"2024-06-17 13:44:00"二、有校時服務器的話 1、手動校時 ntpdate 14.193.73.22、自動校時 寫一個校時服務腳本 14.193.73.2 是校驗時間服務器 #!/bin/sh while true dontpdate 14.193.73.2sleep 5;hwclock…

源碼分析之Openlayers中的控件篇Control基類介紹

概述 Openlayers 中內置了9類控件&#xff0c;這9類控件都是基于Control類&#xff0c;而Control類則是繼承于BaseObject類&#xff0c;如下圖所示&#xff1a; 如上&#xff0c;這9類控件分別是&#xff1a; Attribution&#xff1a;屬性控件FullScreen:全屏控件MousePositi…

計算機網絡知識點全梳理(二.HTTP知識點總結)

目錄 HTTP基本概念 HTTP優缺點 HTTP優點&#xff08;1.1&#xff09; HTTP缺點 HTTP與HTTPS HTTP 與 HTTPS 的區別 HTTPS 解決 HTTP 的哪些安全問題&#xff1f; HTTPS 如何解決安全問題&#xff1f; HTTPS 連接建立的過程&#xff1a; HTTP/1.1、HTTP/2、HTTP/3 演…

第P2周:Pytorch實現CIFAR10彩色圖片識別

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 目標 實現CIFAR-10的彩色圖片識別實現比P1周更復雜一點的CNN網絡 具體實現 &#xff08;一&#xff09;環境 語言環境&#xff1a;Python 3.10 編 譯 器: …