一、思路步骤
- 找中点:用快慢指针找到链表中间节点
- 反转后半段:把中点后面的链表反转
- 双指针比较:从头和从中点开始,逐个比较值
- 全部相等 → 回文;否则不是
如何找中点呢?
利用双指针的思想:
核心原理
- 慢指针 slow :每次走 1 步
- 快指针 fast :每次走 2 步
当快指针走到链表末尾 时,慢指针刚好走了一半 → 停在中点!
反转链表:就是调换指针的引用(固定套路)
从头节点开始遍历,进行一一比较如果值不相同直接结束循环返回false否则返回true
完整代码实现:
java
class Solution {
public boolean isPalindrome(ListNode head) {
// 找中点
ListNode slow =head;
ListNode fast = head;
while(fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
// 从中点进行反转链表
ListNode secondHead = reverse(slow.next);
ListNode left = head;
ListNode right = secondHead;
boolean result = true;
while(right != null){
if(left.val != right.val){
result = false;
break;
}
left = left.next;
right = right.next;
}
return result;
}
//反转链表
private ListNode reverse(ListNode head){
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}