234. Palindrome Linked List回文链表

来源:互联网 发布:淘宝店铺运营外包 编辑:程序博客网 时间:2024/05/16 08:58

回文是指从前往后读和从后往前读是一样的,这样有两种情况:

偶数个:baccab

奇数个:bacab

因此需要考虑两种情况,找到中心,再反向遍历。

而链表中找中心的办法通常是采用快慢指针,快指针走两步,慢指针走一步。(快慢指针还可以用在寻找最小找交叉节点)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
    //需要保存三个节点,当前节点p,前一个节点pre,下一个节点q。
    //尾节点wei即为下一节点为空的位置
        ListNode pre=null;//初始化的前一节点为null
        ListNode p=head;
        ListNode wei=null;
        while(p!=null){
            ListNode q=p.next;//保存当前节点的下一节点
            if(q==null){
                wei=p;
            }
            p.next=pre;
            pre=p;
            p=q;
        }
        return wei;
    }
    public boolean isPalindrome(ListNode head) {
        ListNode pfast=head;
        ListNode pslow=head;
        ListNode p=head;
        ListNode q=head;
        if(head==null||head.next==null) return true;
        while(pfast.next!=null&&pfast.next.next!=null){
            pfast=pfast.next.next;
            pslow=pslow.next;//找中点,pslow当为偶数时为中点的靠前一个节点,为奇数是恰好为中点。
        }
        ListNode slow=pslow.next;//从slow的下一节点开始分两边比较。
        boolean drome=true;
        ListNode new_slow=reverseList(slow);
        while(new_slow!=null){
            if(q.val!=new_slow.val) {
                drome=false;
                break;
            }
            new_slow=new_slow.next;
            q=q.next;
        }
        return drome;
    }
}