1. 程式人生 > >LeetCode—206—Reverse Linked List

LeetCode—206—Reverse Linked List

題目

Reverse a singly linked list.

Example:

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

翻譯

反轉單鏈表

解題思路

下面展示迭代方式和遞迴方式解題

迭代方式

首先我們看一張圖
在這裡我們定義了三個指標。指向前一個節點的pre。指向當前節點的cur。和指向下一節點的next。pre指標初始化時候指向空指標。

之後我們讓當前cur指標改向。指向pre指標。pre指標在這裡的作用主要是儲存上一個節點的資訊。


我們讓pre指標指向cur指標。cur指標指向next指標。next通過節點自身的下一個元素指向下一個元素。相當於三個指標都向前走了一步。

繼續重複這個過程。讓cur指標指向pre指標。pre指標指向cur指標。cur指標指向next指標。next指標通過節點自身的下一個元素指向下一個元素。

具體程式碼如下

// 206. Reverse Linked List
// https://leetcode.com/problems/reverse-linked-list/description/
// 時間複雜度: O(n)
// 空間複雜度: O(1)
public class Solution1 {

    public
class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; while(cur != null){ ListNode next = cur.next; cur.next = pre;
pre = cur; cur = next; } return pre; } }

遞迴方式

前面非遞迴方式是從前面數1開始往後依次處理,而遞迴方式則恰恰相反,它先迴圈找到最後面指向的數5,然後從5開始處理依次翻轉整個連結串列。
  首先指標H迭代到底,如下圖所示,並且設定一個新的指標作為翻轉後的連結串列的頭。由於整個連結串列翻轉之後的頭就是最後一個數,所以整個過程NewH指標一直指向存放5的地址空間。

 然後H指標逐層返回的時候依次做下圖的處理,將H指向的地址賦值給H->next->next指標,並且一定要記得讓H->next =NULL,也就是斷開現在指標的連結,否則新的連結串列形成了環,下一層H->next->next賦值的時候會覆蓋後續的值。

繼續返回操作

返回到頭

程式碼如下:

// 206. Reverse Linked List
// https://leetcode.com/problems/reverse-linked-list/description/
// 遞迴的方式反轉連結串列
// 時間複雜度: O(n)
// 空間複雜度: O(n) 
public class Solution2 {

    public class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }

    public ListNode reverseList(ListNode head) {

        // 遞迴終止條件
        if(head == null|| head.next == null)
            return head;

        ListNode rhead = reverseList(head.next);

        // head->next此刻指向head後面的連結串列的尾節點
        // head->next->next = head把head節點放在了尾部
        head.next.next = head;
        head.next = null;

        return rhead;
    }
}

關注我免費下載CSDN

關注公眾號哦