题解 | #链表分割#

链表分割

https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70

1.思路

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

2.图解

alt

3.解题步骤

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

4.代码

public boolean chkPalindrome() {
        if (head == null) {
            return false;
        }
        if (head.next == null) {
            return true;
        }
        ListNode fast = head;
        ListNode slow = head;
        //寻找中间结点
        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 != head) {
            if (head.val != slow.val) {
                return false;
            }
            if (head.next == slow) {//走到这里两个val值一样,偶数情况
                return true;
            }
            head = head.next;
            slow = slow.next;
        }
        return true;
    }
全部评论

相关推荐

2本硕,在这一个下午真的绷不住了,浪费了太多时间,现在的技术栈还停在C语言和stm32上,找嵌入式的实习面试被拷打,找杭州的一个也找不到,真的心里难受,linux没学过,研二了开始慌了。
一条淡水魚:嵌入式这行的面试我认为实际项目比较重要,技术栈简单的提一嘴就行,面试官在乎的关键点在于你用了这些技术做了哪些工作解决了什么问题,而不是停留在离散的那些个技术栈上,那除了教课没有意义,好比你提到的c语言和32,你用32做过哪些具体的项目?接触过什么外设?使用过哪些公司的SDK?有没有实际产品落地?以及各种只有进入真正的生产环节当中才会积累到的经验......主动去和面试官讨论这些实际的问题,甚至还能就某个具体参数的合理性与他去简单探讨一下,只要技术栈对口,基本上就稳啦~(另外linux和RTOS是嵌入式的标配哦,选一个方向走下去吧)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务