【Leetcode】206.反轉鏈表

題目描述

206.反轉鏈表

反轉一個單鏈表。

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

題目解析

方法一:迭代反轉

解題思路

從題意分析,反轉鏈表對於鏈表上每個節點來說,就是將當前節點 currnext 指針指向其前繼節點 prev 直到鏈表末尾,所以遍歷鏈表時需要一個指針來標識當前節點 curr 的前繼節點 prev ,也需要一個指針來標識當前節點 curr 的後繼節點 next ,防止當前節點反轉後無法繼續遍歷。

代碼示例

Java:

/*
* Definition for singly-linked list.
*/
public class ListNode {
  int val;
  ListNode next;
  ListNode(int x) { val = x; }
}

public ListNode reverseList(ListNode head) {
  ListNode prev = null, curr = head, next = head;
  while(curr != null) {
    next = curr.next;
    curr.next = prev;
    prev = curr;
    curr = next;
  }
  return prev;
}

複雜度分析

時間複雜度:O(n),遍歷整個單鏈表

空間複雜度:O(1),沒有額外開闢空間

方法二:遞歸反轉

解題思路

遞歸解法的思路就是假設頭節點 head 後面的鏈表都已經完成反轉(通過遞歸完成),現在要處理的就是當前節點 head 和它的下一個節點 next 的反轉 head.next.next = head

代碼示例

Java

/*
* Definition for singly-linked list.
*/
public class ListNode {
  int val;
  ListNode next;
  ListNode(int x) { val = x; }
}

public ListNode reverseList(ListNode head) {
  // termination condition
  if (head == null || head.next == null) {
    return head;
  }
  // recursion
  ListNode newHead = reverseList(head.next);
  // process current data
  head.next.next = head;
  head.next = null;
  return newHead;
}

複雜度分析

時間複雜度:O(n),遍歷整個單鏈表

空間複雜度:O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章