LeetCode-206-Reverse Linked List
阿新 • • 發佈:2018-12-17
題目
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通過節點自身的下一個元素指向下一個元素。相當於三個指標都向前走了一步。
// 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
關注公眾號哦