1. 程式人生 > 其它 >反轉連結串列-LeetCode206 改變指向

反轉連結串列-LeetCode206 改變指向

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指標

。最後,cur 指標已經指向了null,迴圈結束,連結串列也反轉完畢了。 此時我們return pre指標就可以了,pre指標就指向了新的頭結點。

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);
    }
}

    這又是一道雙指標的題,不難,只要把之前題弄懂即可!!!