题解 | #判断一个链表是否为回文结构#
判断一个链表是否为回文结构
https://www.nowcoder.com/practice/3fed228444e740c8be66232ce8b87c2f
1、快慢指针找中点,用快指针多一个起点的方法,可以保证慢指针的next为最短的后半部分
2、把后半部分反转
3、用后半部分来循环对比前半部分,满足后半部分完全匹配即可,无需在意前半部分多一个中间点,因为链表可能是基础的情况
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
public boolean isPail (ListNode head) {
// write code here
if(head.next == null)
return true;
// 1、快慢指针找出中点
ListNode fast = head.next, slow = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
// 2、直接把后半部分赋值,前半部分可能存在多一个中间点,但是我们的对比方法可以兼容
ListNode tmp = slow.next;
slow.next = null;
// 3、反转后半部分的指针
ListNode res = reverse(tmp);
// 4、比较俩个链表,可能存在一长一短,因为可能是奇数的链表,但是可以忽略,因为保证后半部分是最短的
while (res != null) {
if (res.val != head.val)
return false;
res = res.next;
head = head.next;
}
return true;
}
// 反转链表(基础)
public ListNode reverse(ListNode head){
ListNode pre = null;
while(head != null){
ListNode tmp = head.next;
head.next = pre;
pre = head;
head = tmp;
}
return pre;
}
}
#链表回文#

