1. 程式人生 > >LeetCode 206. Reverse Linked List(反轉連結串列)兩種方法實現

LeetCode 206. Reverse Linked List(反轉連結串列)兩種方法實現

本文用兩種方法實現連結串列的反轉(LeetCode 206. Reverse Linked List):①利用next指標穿針引線;②遞迴演算法。

題目:

Reverse a singly linked list.

Example:

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

Follow up:

A linked list can be reversed either iteratively or recursively. Could you implement both?

方法一:利用ListNode的next指標穿針引線,原地反轉。

分析:

head(cur)

    1    ->    2    ->    3    ->    4    ->    5    ->    NULL

從第一個節點開始,節點1的next指標指向NULL,實現了第一個節點的反轉,反轉以後連結串列變成:

                    cur

NULL    <-     1     2    ->    3    ->    4    ->    5    ->    NULL

這樣的話第二個節點就找不到了,需要先儲存一個第二個節點(節點1的下一個節點),所以要定義一個next節點來儲存第二個節點。

  cur        next

    1    ->    2    ->    3    ->    4    ->    5    ->    NULL

cur的next指標指向NULL,cur和next後移:

                         cur        next

  NULL<-  1        2    ->    3    ->    4    ->    5    ->    NULL

這樣更新完之後又會丟失上一個節點,所以也需要一個定義一個pre指標來儲存前一個節點。

  pre          cur        next

NULL          1    ->    2    ->    3    ->    4    ->    5    ->    NULL

接著cur節點next指標指向pre:

    pre           cur      next

NULL     <-     1        2    ->    3    ->    4    ->    5    ->    NULL

向後移動,反轉下個節點:

                    pre       cur      next

NULL     <-     1        2    ->    3    ->    4    ->    5    ->    NULL

執行重複操作,直到完成反轉。程式碼如下:

class Solution {
    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;        
    }
}

方法二:遞迴演算法實現反轉。

終止條件:head為空或者只有head一個節點的時候,返回head。

遞迴實現:把連結串列看成兩個“節點”,第一個節點是head,第二個節點是剩餘部分,將這兩個節點完成反轉。

程式碼如下:

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next==null){
            return head;
        }
        
        ListNode node = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return node;
    }
}