反轉連結串列-LeetCode206 改變指向
阿新 • • 發佈:2022-12-02
LeetCode連結:https://leetcode.cn/problems/reverse-linked-list/
題目:給你單鏈表的頭節點 head
,請你反轉連結串列,並返回反轉後的連結串列。
示例1:
輸入:head = [1,2,3,4,5] 輸出:[5,4,3,2,1]
示例2:
輸入:head = [1,2] 輸出:[2,1]
相信很多人第一次拿到這種題目跟我一樣,想的就是再建立一個空間,但是這樣太浪費記憶體了,有更好的辦法解決。
思路
其實只需要改變連結串列的next指標的指向,直接將連結串列反轉 ,而不用重新定義一個新的連結串列,如圖所示(來自程式碼隨想錄):
之前連結串列的頭節點是元素1, 反轉之後頭結點就是元素5 ,這裡並沒有新增或者刪除節點,僅僅是改變next指標的方向。
那麼接下來看一看是如何反轉的呢?
首先定義一個cur指標,指向頭結點,再定義一個pre指標,初始化為null。然後就要開始反轉了,首先要把 cur->next 節點用tmp指標儲存一下,也就是儲存一下這個節點。為什麼要儲存一下這個節點呢,因為接下來要改變 cur->next 的指向了,將cur->next 指向pre ,此時已經反轉了第一個節點了。
接下來,就是迴圈走如下程式碼邏輯了,繼續移動pre和cur指標
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); } }
這又是一道雙指標的題,不難,只要把之前題弄懂即可!!!