题目的主要信息:
- 给定一个链表的头节点,判读该链表是否为回文结构
- 回文结构即正序遍历与逆序遍历结果都是一样的,类似123321
- 空链表默认为回文结构
方法(双指针找中点):
思路:
我们首先来看看中点的特征,一个链表的中点,距离链表开头是一半的长度,距离链表结尾也是一半的长度,那如果从链表首遍历到链表中点位置,另一个每次遍历两个节点的指针是不是就到了链表尾,那这时候我们的快慢双指针就登场了。
具体做法:
- step 1:慢指针每次走一个节点,快指针每次走两个节点,快指针到达链表尾的时候,慢指针刚好到了链表中点。
- step 2:从中点的位置,开始往后将后半段链表反转。
- step 3:按照方法三的思路,左右双指针,左指针从链表头往后遍历,右指针从链表尾往反转后的前遍历,依次比较遇到的值。
import java.util.*;
public class Solution {
//反转链表指针
ListNode reverse(ListNode head) {
//前序节点
ListNode prev = null;
while(head != null){
//断开后序
ListNode next = head.next;
//指向前序
head.next = prev;
prev = head;
head = next;
}
return prev;
}
public boolean isPail (ListNode head) {
//空链表直接为回文
if(head == null)
return true;
//准备快慢双指针
ListNode slow = head;
ListNode fast = head;
//双指针找中点
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
//中点处反转
slow = reverse(slow);
fast = head;
while(slow != null){
//比较判断节点值是否相等
if(slow.val != fast.val)
return false;
fast = fast.next;
slow = slow.next;
}
return true;
}
}