核心思想
頭插法: 不斷的將cur指針所指向的節點放到頭節點之前,然后頭節點指向cur節點,因為最后返回的是head.next 。
解題思路
1.如果頭節點是空的,或者是只有一個節點,只需要返回head節點即可。
if (head == null || head.next == null) return head;
2.定義一個cur節點,我們要做的就是不斷的把cur節點頭插到head節點。head.next置為空。我們只要在這個鏈表上操作。實際上就是斷開成兩條鏈表,cur指針在另一個鏈表上不斷的遍歷,而另一個就是我們要的head
ListNode cur = head.next;
head.next = null;
3.頭插法操作,我們需要一個curNext來保存cur的下一個節點。因為cur一直要用來頭插,而這時候就會斷鏈 ,導致不知道cur的下一個節點在哪里,因此用一個指針來記錄。
while (cur != null) {ListNode curNext = cur.next;//需要記錄cur節點的下一個節點,因為每次都是cur節點插到頭節點前面//下次使用的時候必須能找到cur的下一個節點,因為curNext是下一次頭插的節點cur.next = head;head = cur;//上述就是頭插法cur = curNext;}
完整代碼
?
class Solution {public ListNode reverseList(ListNode head) {if (head == null || head.next == null)return head;ListNode cur = head.next;head.next = null;//在這里需要斷開頭節點和后面的節點,然后進行頭插法while (cur != null) {ListNode curNext = cur.next;//需要記錄cur節點的下一個節點,因為每次都是cur節點插到頭節點前面//下次使用的時候必須能找到cur的下一個節點,因為curNext是下一次頭插的節點cur.next = head;head = cur;//上述就是頭插法cur = curNext;}return head;}
}
圖解
?
?
?
?
?
?
?
?
?
?
?
頭插法的好處
- 不需要額外的空間存儲反轉后的鏈表,操作都在原鏈表上進行。
- 時間復雜度為O(n),只需要遍歷鏈表一次。
- 代碼實現相對簡單,邏輯清晰,易于理解和實現。
?