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

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

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

进步感受:

well done~~!,又是自己做出这道题目了,没有一点提示,经过不断的锻炼大脑好像慢慢被活化了,灵感崩发,让我想到了链表平分+翻转对比,来实现判断是否为回文!

解题思路:

官方的解题思路跟我的是一样的,都是平分链表+翻转比较,但是,官方是从后面翻转,我则是从前面翻转,导致我要考虑链表奇数偶数个的情况。

具体实现步骤:

1,使用快慢指针,平分两个链表;

2、从中点slow指针,开始翻转链表,之后比较是否相等,从而判断是否是回文结构;

3、有一点要注意的是,翻转的时候,其实会断开head的链表的。

// 思路把链表平分成两段,之后对前半段翻转,之后就可以比较了

// 把链表平分的方法,一种是得到长度后再计算,平分,另一种则是用快慢指针,直接平分更快

// 就类似单链表排序的问题,可以用left/mid/right对链表进行拆分,right为空说明偶数,否则是奇数

import java.util.*;

public class Solution {

    /**
     * 官方的解法,跟我的解法是一样的,
     * 平分链表后,反转一半,但是我是从左边翻转,
     * 导致,要考虑奇偶数个的情况。
     */
    public boolean isPail (ListNode head) {
        if(head==null) {
            return false;
        }
        ListNode fast = head;
        ListNode slow = head;

        while(fast!=null && fast.next!=null) {
            slow = slow.next;
            fast = fast.next.next;
        }

        // 这里有意思,
        // slow后面的链表翻转的同时
        // 第一次翻转时,prev==null
        // 会导致head链表断开到slow节点
        // 而反转列表从slow节点开始
        // 举个例子head={1,2,2,2,1},反转后
        // head={1,2,2}, slow={1,2,2} 
        slow = reverseListNode(slow);
        fast = head;
        while(slow != null) {
            if(slow.val != fast.val) {
                return false;
            }
            fast = fast.next;
            slow = slow.next;
        }

        return true;
    }


    /**
     * 我的解法
     * @param head ListNode类 the head
     * @return bool布尔型
     */
     // 思路把链表平分成两段,之后对前半段翻转,之后就可以比较了
     // 把链表平分的方法,一种是得到长度后再计算,平分,另一种则是用快慢指针,直接平分更快
     // 就类似单链表排序的问题,可以用left/mid/right对链表进行拆分,right为空说明偶数,否则是奇数
    public boolean isPail2 (ListNode head) {
        if(head== null) {
            return false;
        }
        if(head.next==null) {
            return true;
        }

        ListNode left = head;
        ListNode mid = head.next;
        ListNode right = head.next.next;

        while(right!=null && right.next!=null) {
            left = left.next;
            mid = mid.next;
            right = right.next.next;
        }

        ListNode leftNode,righNode;
      
        if(right == null) {  // 说明是偶数个
            left.next = null;
            leftNode = reverseListNode(head);
            righNode = mid;
        } else { // 说明是奇数个
            left.next = null;
            leftNode = reverseListNode(head);
            righNode = mid.next;
        }

        while(leftNode!=null && righNode!=null) {
            if(leftNode.val == righNode.val) {
                leftNode = leftNode.next;
                righNode = righNode.next;
            } else {
                return false;
            }
        }
       
        return leftNode==righNode;
    }

    // 反转链表
    ListNode reverseListNode(ListNode head) {
        ListNode curr = head;
        ListNode prev = null;

        while(curr!=null) {
            ListNode temp = curr.next;
            curr.next = prev;
            prev = curr;
            curr = temp;
        }
        return prev;
    }

  
}
全部评论

相关推荐

搜索部 首先说下timeline8.18,投递8.19,约一面8.21,晚上一面call约二面8.22,上午二面下午oc周末等待(8.23,8.24)8.25,offer一年前,我还是懵懵懂懂,高考完的暑假,只会提前学学高数,未来的画像是什么?我或许无法预测。开学后,自学Python,接单,无数个客户的ddl,偷偷摸摸一个人找自习的地方,这一步步竟然为后来的我,搭建工程能力的基础。大一上,我也要感谢我的第一位老板,让我接触到了实习,师兄带着我一步步入门,看他们写的飞书文档。大一下,导师带我参与企业项目,这让我渐渐发现,应该去实践,增长见识,而非局限当下,盯着自己的小新pro。不久后,第一波投递开始,结果当然是约面极少。盯着简历上的文字和ssob,我开始思考,确实很多可以去提升。带着些许不甘心,继续沉淀,慢慢的约面也越来越多,有的时候两天7场,准备完就接着下一个日程。这一次,也许是刚好到位吧,比较match,面试答的流利,关关难关关过,成为度孝子展望未来,依然是重重挑战,果然只有收到offer的那一刻是开心的。愿在百度星海拆解的每一段代码,都能成为丈量宇宙的诗行;此志终赴星河,而今迈步重铸天阶。屏幕前的你们,在无数个向星海奔赴的日夜,一定一定,会在未来化作群星回响的征程——请永远相信此刻埋首耕耘的自己!!!
一天三顿半:???百度提前批发 offer了?不是统一和正式批排序完再发吗我靠
百度求职进展汇总
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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