题目描述
思路
三个指针,分别n1,n2,n3;三个指针不断往后移动。
1、总体思路
找到中间节点,然后把后半个链表反转后与前半部分比较。
(注意:奇数个链表的话是从中点的后一个节点逆置;偶数个链表的话从中间链表的节点逆置)
2、问题是如何找到中间节点
使用快慢指针,两指针一开始都指向head,那么fast一次2步,slow一次1步,那么fast走到最后的节点,slow刚好指向中间。
Java代码
方法1:
借助快慢指针找到中间的节点,翻转后比较前后两半段
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
// 1 使用快慢指针找到链表的中间节点
ListNode slow = A;
ListNode fast = A;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
}
//2 对后半段链表进行逆置操作
ListNode reversed = reverse(slow);
//3 比较判断回文
while(reversed!=null && A!=null){
if(reversed.val != A.val){
return false;
}else{
reversed = reversed.next;
A = A.next;
}
}
//跳出while循环,表示比较完毕,返回是回文
return true;
}
//链表翻转
public ListNode reverse(ListNode A) {
ListNode n0=null;
ListNode n1=A;
ListNode n2=A.next;
while(n1!=null){
//指向翻转
n1.next = n0;
//指针赋值
n0 = n1;
n1 = n2;
if(n2!=null){
n2 = n2.next; //n2后移;存在最后一次n2已经为空的后移
}
}
//返回n0
return n0;
}
}
输出:
原文:https://www.cnblogs.com/jiyongjia/p/13296280.html