題目描述
反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
題目解析
方法一:迭代反轉
解題思路
從題意分析,反轉鏈表對於鏈表上每個節點來說,就是將當前節點 curr 的 next 指針指向其前繼節點 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)