题解 | #链表的回文结构#

链表的回文结构

https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa

1.思路

  • 1.先通过快慢指针,找到中间结点
  • 2.对中间结点后面的链表进行反转
  • 3.指针从两端开始移动,如果符合回文结构,在奇数情况下相与,在偶数情况下相邻

2.图解

alt

3.解题步骤

  • 1.判断头结点是否为空,判断是否只有一个结点
  • 2.设立快慢指针,找到中间的结点
  • 3.设cur结点为中间结点的下一个结点,进行后面链表的反转
  • 4.当cur为空时,说明slow到了末尾
  • 5.让头结点和slow向中间移动
  • 6.如果两端的值不等时,直接返回false
  • 7.在奇数个结点的情况下,head和slow相遇
  • 8.在偶数结点的情况下,head的下一个结点就是slow

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
        if (A == null) {
            return false;
        }
        if (A.next == null) {
            return true;
        }
        ListNode fast = A;
        ListNode slow = A;
        //寻找中间结点
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        //翻转
        ListNode cur = slow.next;//cur代表当前需要翻转的结点
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }
        //一个从前往后,一个从后往前,进行比较, 直到slow和head相遇
        while (slow != A) {
            if (slow.val != A.val) {
                return false;
            }
            if (A.next == slow) { //走到这里两个val值一样,偶数情况
                return true;
            }
            A = A.next;
            slow = slow.next;
        }
        return true;
    }
}
全部评论

相关推荐

威猛的小饼干正在背八股:挂到根本不想整理
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务