1.雙指針法
1.1 解題思路
1.我們可以申請兩個指針,第一個指針叫 prev,最初是指向 null 的。
2.第二個指針 curr 指向 head,然後不斷遍歷 curr。
3.每次迭代到 curr,都將 curr 的 next 指向 prev,然後 prev 和 curr 前進一位。
4.都迭代完了(curr 變成 null 了),prev 就是最後一個節點了。
1.2 代碼思路
/**
* 雙指針迭代
* 我們可以申請兩個指針,第一個指針叫 pre,最初是指向 null 的。
* 第二個指針 cur 指向 head,然後不斷遍歷 cur。
* 每次迭代到 cur,都將 cur 的 next 指向 pre,然後 pre 和 cur 前進一位。
* 都迭代完了(cur 變成 null 了),pre 就是最後一個節點了。
*
* @param head
* @return 鏈表
*/
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode tempNode = curr.next;
curr.next = prev;
prev = curr;
curr = tempNode;
}
return prev;
}
1.3 複雜度分析
時間複雜度: O(n),假設 n 是列表的長度,時間複雜度是 O(n)。
空間複雜度: O(1)
2.遞歸
2.1 解題思路
終止條件是當前節點或者下一個節點==null
在函數內部,改變節點的指向,也就是 head 的下一個節點指向 head
遞歸函數那句head.next.next = head
2.2 代碼思路
2.3複雜度分析
時間複雜度:O(n),假設 n是列表的長度,那麼時間複雜度爲 O(n)。
空間複雜度:O(n),由於使用遞歸,將會使用隱式棧空間。遞歸深度可能會達到 n 層。