题解 | #判断一个链表是否为回文结构#

判断一个链表是否为回文结构

https://www.nowcoder.com/practice/3fed228444e740c8be66232ce8b87c2f

1、快慢指针找中点,用快指针多一个起点的方法,可以保证慢指针的next为最短的后半部分

2、把后半部分反转

3、用后半部分来循环对比前半部分,满足后半部分完全匹配即可,无需在意前半部分多一个中间点,因为链表可能是基础的情况

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    public boolean isPail (ListNode head) {
        // write code here
        if(head.next == null)
            return true;
        // 1、快慢指针找出中点
        ListNode fast = head.next, slow = head;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        // 2、直接把后半部分赋值,前半部分可能存在多一个中间点,但是我们的对比方法可以兼容
        ListNode tmp = slow.next;
        slow.next = null;
        // 3、反转后半部分的指针
        ListNode res = reverse(tmp);
        //  4、比较俩个链表,可能存在一长一短,因为可能是奇数的链表,但是可以忽略,因为保证后半部分是最短的
        while (res != null) {
            if (res.val != head.val)
                return false;
            res = res.next;
            head = head.next;
        }
        return true;
    }

    // 反转链表(基础)
    public ListNode reverse(ListNode head){
        ListNode pre = null;
        while(head != null){
            ListNode tmp = head.next;
            head.next = pre;
            pre = head;
            head = tmp;
        }
        return pre;
    }
    
}

#链表回文#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务