其他分享
首页 > 其他分享> > 234. 回文链表

234. 回文链表

作者:互联网

package leetcode;

public class demo_234 {
    public boolean isPalindrome(ListNode head) {
        if(head==null||head.next==null) {return true;}
        ListNode slow=head;
        ListNode fast=head.next.next;
        //标记原链表长度为奇数还是偶数
        int flag=2;
        while(fast!=null) {
            slow=slow.next;
            if(fast.next!=null) {
                fast=fast.next.next;
            }else {
                //长度为奇数
                flag=1;
                fast=fast.next;
            }
        }
        //fast表示链表剩余一半开始位置
        fast=slow.next;
        //从中间断开两个链表
        slow.next=null;
        //slow表示前一半翻转之后开始的位置
        slow=reverse(head);
        //如果链表长度为奇数,那么前一半会比后一半多一个节点,那个节点是中间结点不用比较
        if(flag==1) {
            slow=slow.next;
        }
        while(slow!=null&&fast!=null) {
            if(slow.val!=fast.val) {
                return false;
            }
            slow=slow.next;
            fast=fast.next;
        }
        return true;
    }
    
    //翻转链表
    public ListNode reverse(ListNode head) {
        if(head==null) {return null;}
        
        ListNode node=head.next;
        ListNode pre=head;
        ListNode first=head;
        ListNode cur;
        
        while(node!=null) {
            cur=node;
            node=node.next;
            pre.next=cur.next;
            cur.next=first;
            first=cur;        
        }
        return first;
    }
}

 

标签:head,slow,ListNode,fast,next,链表,234,null,回文
来源: https://www.cnblogs.com/Yshun/p/16220717.html