
解題思路:
- 定義三個指針: prev(前驅節點)、current(當前節點)、nextNode(臨時保存下一個節點)
- 遍歷鏈表: 每次將 current.next 指向 prev,移動指針直到 current 為 null。
Java代碼:
public class Solution {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode current = head;while (current != null) {ListNode nextNode = current.next;current.next = prev;prev = current;current = nextNode;}return prev;}
}
復雜度分析:
- 時間復雜度: O(n),需要遍歷所有節點一次。
- 空間復雜度: O(1),僅使用固定數量的額外空間。

解題思路:
- 找中點: 使用快慢指針,快指針每次移動兩步,慢指針每次移動一步,直到快指針到達末尾。此時慢指針位于鏈表中點。
- 反轉后半部分: 將中點之后的鏈表部分反轉。
- 對稱比較: 從頭節點和中點開始,逐個比較對應節點的值是否相等。
Java代碼:
public class Solution {public boolean isPalindrome(ListNode head) {if (head == null || head.next == null) return true;ListNode slow = head, fast = head.next;while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;}ListNode prev = null, curr = slow.next;while (curr != null) {ListNode nextNode = curr.next;curr.next = prev;prev = curr;curr = nextNode;}ListNode p1 = head, p2 = prev;while (p2 != null) {if (p1.val != p2.val) return false;p1 = p1.next;p2 = p2.next;}return true;}
}
復雜度分析:
- 時間復雜度: O(n),所有操作均遍歷鏈表一次。
- 空間復雜度: O(1),僅使用常數額外空間。