代碼隨想錄--鏈表--反轉鏈表

題目

題意:反轉一個單鏈表。

示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL

思路

如果再定義一個新的鏈表,實現鏈表元素的反轉,其實這是對內存空間的浪費。

其實只需要改變鏈表的next指針的指向,直接將鏈表反轉 ,而不用重新定義一個新的鏈表,如圖所示:
在這里插入圖片描述之前鏈表的頭節點是元素1, 反轉之后頭結點就是元素5 ,這里并沒有添加或者刪除節點,僅僅是改變next指針的方向。

那么接下來看一看是如何反轉的呢?

我們拿有示例中的鏈表來舉例,如動畫所示:(糾正:動畫應該是先移動pre,在移動cur)
在這里插入圖片描述首先定義一個cur指針,指向頭結點,再定義一個pre指針,初始化為null。

然后就要開始反轉了,首先要把 cur->next 節點用tmp指針保存一下,也就是保存一下這個節點。

為什么要保存一下這個節點呢,因為接下來要改變 cur->next 的指向了,將cur->next 指向pre ,此時已經反轉了第一個節點了。

接下來,就是循環走如下代碼邏輯了,繼續移動pre和cur指針。

最后,cur 指針已經指向了null,循環結束,鏈表也反轉完畢了。 此時我們return pre指針就可以了,pre指針就指向了新的頭結點。

雙指針法

class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp; // 保存cur的下一個節點
ListNode* cur = head;
ListNode* pre = NULL;
while(cur) {
temp = cur->next; // 保存一下 cur的下一個節點,因為接下來要改變cur->next
cur->next = pre; // 翻轉操作
// 更新pre 和 cur指針
pre = cur;
cur = temp;
}
return pre;
}
};
時間復雜度: O(n)
空間復雜度: O(1)

遞歸法

遞歸法相對抽象一些,但是其實和雙指針法是一樣的邏輯,同樣是當cur為空的時候循環結束,不斷將cur指向pre的過程。

關鍵是初始化的地方,可能有的同學會不理解, 可以看到雙指針法中初始化 cur = head,pre = NULL,在遞歸法中可以從如下代碼看出初始化的邏輯也是一樣的,只不過寫法變了。

具體可以看代碼(已經詳細注釋),雙指針法寫出來之后,理解如下遞歸寫法就不難了,代碼邏輯都是一樣的。
class Solution {
public:
ListNode* reverse(ListNode* pre,ListNode* cur){
if(cur == NULL) return pre;
ListNode* temp = cur->next;
cur->next = pre;
// 可以和雙指針法的代碼進行對比,如下遞歸的寫法,其實就是做了這兩步
// pre = cur;
// cur = temp;
return reverse(cur,temp);
}
ListNode* reverseList(ListNode* head) {
// 和雙指針法初始化是一樣的邏輯
// ListNode* cur = head;
// ListNode* pre = NULL;
return reverse(NULL, head);
}

};

時間復雜度: O(n), 要遞歸處理鏈表的每個節點
空間復雜度: O(n), 遞歸調用了 n 層棧空間

我們可以發現,上面的遞歸寫法和雙指針法實質上都是從前往后翻轉指針指向,其實還有另外一種與雙指針法不同思路的遞歸寫法:從后往前翻轉指針指向。

具體代碼如下(帶詳細注釋):
class Solution {
public:
ListNode* reverseList(ListNode* head) {
// 邊緣條件判斷
if(head == NULL) return NULL;
if (head->next == NULL) return head;

    // 遞歸調用,翻轉第二個節點開始往后的鏈表ListNode *last = reverseList(head->next);// 翻轉頭節點與第二個節點的指向head->next->next = head;// 此時的 head 節點為尾節點,next 需要指向 NULLhead->next = NULL;return last;
}

};

時間復雜度: O(n)
空間復雜度: O(n)

Java

// 雙指針
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode cur = head;
ListNode temp = null;
while (cur != null) {
temp = cur.next;// 保存下一個節點
cur.next = prev;
prev = cur;
cur = temp;
}
return prev;
}
}

// 遞歸
class Solution {
public ListNode reverseList(ListNode head) {
return reverse(null, head);
}

private ListNode reverse(ListNode prev, ListNode cur) {if (cur == null) {return prev;}ListNode temp = null;temp = cur.next;// 先保存下一個節點cur.next = prev;// 反轉// 更新prev、cur位置// prev = cur;// cur = temp;return reverse(cur, temp);
}

}

// 從后向前遞歸
class Solution {
ListNode reverseList(ListNode head) {
// 邊緣條件判斷
if(head == null) return null;
if (head.next == null) return head;

    // 遞歸調用,翻轉第二個節點開始往后的鏈表ListNode last = reverseList(head.next);// 翻轉頭節點與第二個節點的指向head.next.next = head;// 此時的 head 節點為尾節點,next 需要指向 NULLhead.next = null;return last;
} 

}

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

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

相關文章

GPU學習記一下線程分組相關

在compute的時候,是要dispatch一個數量的代表分了多少塊任務集,dispatch的塊內部也是有一個數量的,那么這些值怎么取的呢 內部,N卡32 外面dispatch的數量就是all/32 然后細說這個值 這有一個叫core的東西,就是相當于th…

嵌入式學習-PWM輸出比較

簡介 PWM技術 輸出比較框圖介紹 定時器部分 比較器控制部分 輸出控制部分 相關寄存器

(5.4–5.10)投融資周報|共38筆公開投融資事件,基礎設施領跑,游戲融資活躍

5月4日至5月10日期間,加密市場共發生38筆投融資事件,其中基礎設施18筆、游戲5 筆、其他4 筆、DeFi 3筆、Depin 3 筆、CeFi 2筆、NFT2筆、 RWA1筆。 本周千萬美金以上融資有5筆: 加密貨幣交易公司Arbelos完成了一輪2800 萬美元的種子輪融資&…

智慧園區EasyCVR視頻智能管理方案:構建高效安全園區新視界

一、背景分析 園區作為城市的基本單元,是最重要的人口和產業聚集區。根據行業市場調研,90%以上城市居民工作與生活在園區進行,80%以上的GDP和90%以上的創新在園區內產生,可以說“城市,除了馬路都是園區”。 園區形態…

C++ static_cast學習

static_cast可實現, 1 基本類型之間的轉換 2 void指針轉換為任意基本類型的指針 3 用于有繼承關系的子類與父類之間的指針或引用的轉換 用于基本類型轉化時,會損失精度類似于C語言的強制轉化; 下面先看一下void指針的轉換; …

手動實現Promise

// 定義異步調用的主類,名為 MyPromise class MyPromise {// 執行器接收 resolve 和 reject 方法來改變 promise 的狀態constructor(executor) {// 初始化狀態為 "pending"this.state "pending";// 初始化值為 undefinedthis.value undefined…

鏡像抑制和鏡像衰減有什么不同

在很多無線產品接收機手冊中,我們會看到兩個參數,一個是鏡像抑制(Image Rejection),另一個是鏡像衰減(Image Attention),但這兩者究竟有什么不同,一直比較疑惑&#xff0…

AI學習指南線性代數篇-奇異值分解

AI學習指南線性代數篇-奇異值分解 一、概述 在人工智能領域,線性代數是一項非常重要的基礎知識,而奇異值分解(Singular Value Decomposition, SVD)作為線性代數中的一種重要工具,被廣泛應用于機器學習、數據科學等領…

理解Spring的IOC核心:為何它成為開發中的關鍵要素?

Spring框架采用的IOC(依賴注入)技術,是一種創新的設計思路,它授權程序開發人員將組件實例化及生命周期管理的職責轉交給框架自身處理。在這一機制下,Spring框架負責協調并裝配應用程序中的各個組件,從而實現…

以太坊Layer 2開發商StarkWare

文章目錄 以太坊Layer 2開發商StarkWare相關新聞StarkWare是什么團隊介紹StarkEx 和 StarkNet參考以太坊Layer 2開發商StarkWare 相關新聞 據The Block 2021年11月16日消息,使用ZK-rollups技術的以太坊第2層開發商StarkWare在C輪融資中籌集了5000萬美元,其估值已達20億美元…

三路輸出小功率開關電源【MATLAB/simulink】

擬選用一種DC-DC變換器拓撲使用1700 V SiC MOSFET或IGBT設計三相功率系 統的高頻開關直流輔助電源,它可用于太陽能逆變器、工業開關電源、電動汽車充電器、 電機驅動裝置等領域。(建議采用單端反激式電路拓撲,開關頻率為80kHz) 電路基本參數&…

【Unity學習筆記】第十七 Quaternion 中 LookRotation、Lerp、Slerp、RotateTowards等方法辨析與驗證

轉載請注明出處: https://blog.csdn.net/weixin_44013533/article/details/138909256 作者:CSDN|Ringleader| 目錄 Quaternion API 速覽FromToRotation在Transform中的應用LookRotation 中upwards取Vector3.up和 transform.up的區別旋轉時如何保持Y軸不變&#xff…

leetcode題目45

跳躍游戲Ⅱ 中等 給定一個長度為 n 的 0 索引整數數組 nums。初始位置為 nums[0]。 每個元素 nums[i] 表示從索引 i 向前跳轉的最大長度。換句話說&#xff0c;如果你在 nums[i] 處&#xff0c;你可以跳轉到任意 nums[i j] 處: 0 < j < nums[i] i j < n 返回到達 n…

戰網國際服怎么下載 暴雪戰網一鍵下載安裝圖文教程

戰網國際版&#xff0c;或稱為Battle.net全球版&#xff0c;是暴雪娛樂構建的一項跨越國界的綜合游戲交流平臺&#xff0c;它無視地理限制&#xff0c;旨在服務全球每一個角落的游戲愛好者。不同于地區專屬版本&#xff0c;國際版為玩家開啟了一扇無門檻的大門&#xff0c;讓每…

org.springframework.jdbc.BadSqlGrammarException

Cause: java.sql.SQLSyntaxErrorException: Table ‘web.emp’ doesn’t exist 產生原因&#xff1a;web表找不到&#xff0c;所以可能數據庫配置錯誤 spring.datasource.urljdbc:mysql://localhost:3306/web02 更改完成后運行成功

音頻筑基:100字說清哈曼曲線的Why和What

音頻筑基&#xff1a;100字說清哈曼曲線的Why和What 本文為短小精悍的音頻小知識總結&#xff0c;希望有用。 Why 音箱等大型外放設備是沒有哈曼曲線的哈曼曲線是為了解決近耳設備如耳機/助聽器&#xff0c;重放聲音時與聲源實際發聲舉例產生的聽感做衰減匹配也即沒有耳機的重…

免費利器:會議之眼一鍵生成論文功能火爆上線 助你快速起航

會議之眼 快訊 親愛的會議之眼粉絲們&#xff0c;你們是否曾經為了寫論文而徹夜苦思冥想&#xff1f;是否曾經為了找資料而焦頭爛額&#xff1f; 今天小編帶來了一個令人興奮的消息&#xff0c;那就是會議之眼網頁端平臺的全新功能——“一鍵生成論文”已經重磅上線啦&#x…

【計算機畢業設計】springboot房地產銷售管理系統的設計與實現

相比于以前的傳統手工管理方式&#xff0c;智能化的管理方式可以大幅降低房地產公司的運營人員成本&#xff0c;實現了房地產銷售的 標準化、制度化、程序化的管理&#xff0c;有效地防止了房地產銷售的隨意管理&#xff0c;提高了信息的處理速度和精確度&#xff0c;能夠及時、…

STM32-09-IWDG

文章目錄 STM32 IWDG1. IWDG2. IWDG框圖3. IWDG寄存器4. IWDG寄存器操作步驟5. IWDG溢出時間計算6. IWDG配置步驟7. 代碼實現 STM32 IWDG 1. IWDG IWDG Independent watchdog&#xff0c;即獨立看門狗&#xff0c;本質上是一個定時器&#xff0c;這個定時器有一個輸出端&#…

mmdetection訓練(1)voc格式的數據集(自制)

mmdetection訓練&#xff08;1&#xff09;voc格式的數據集&#xff08;自制&#xff09; 提前準備一、voc數據集二、修改配置代碼進行訓練&#xff08;敲黑板&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff09;1.數據集相關內容修改2.自定義配置文件構…