单链表判断是否回文
题目描述
思路
三个指针,分别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) { if(A==null) {return null;} 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; } }
输出: