单链表判断是否回文

题目描述

图片说明

思路

三个指针,分别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;
    }
}

输出:

图片说明