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

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

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

两个思路:

1,利用一个公共变量然后递归回溯实现,公共变量pre从前向后遍历链表,递归到列表尾部后开始回溯,从后往前遍历链表,将pre和回溯到的节点比较。

注意的点:

  1. 返回boolean的值
  2. 输入参数,当前节点head
  3. 递归终止条件:head==null,此时返回true,因为递归中若前一个比较不相等,后面没有比较的必要,所以比较放在if语句中

2,反转后半部分链表,比较,反转利用快慢指针法找到中间节点,这一部分建议自己画个链表试一下,分为单数和双数的情况,你就能明白我的slow和fast的初始化了。

代码:

import java.util.*;

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

public class Solution {
    /**
     * 
     * @param head ListNode类 the head
     * @return bool布尔型
     */
    ListNode pre;
    public boolean isPail (ListNode head) {
//         //方法一:递归实现,利用一个公共变量从前往后遍历,递归法到链表最后开始回溯,和公共变量进
//         //行比较
//         pre=head;
//         return dfs(head);
        
        //方法二,反转一半链表,比较
        if(head==null){
            return true;
        }
        //快慢指针初始化
        ListNode fast=head.next;
        ListNode slow=head;//记得将反转的后一半从原始链表中移去
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        ListNode head1=recur(slow,null);
        slow.next=null;
        while(head!=null){
            if(head.val!=head1.val){
                return false;
            }
            head=head.next;
            head1=head1.next;
        }
        return true;
    }
    private ListNode recur(ListNode cur,ListNode pre){
        if(cur==null){
            return pre;
        }
        ListNode res=recur(cur.next,cur);
        cur.next=pre;
        return res;
    }
    
    private boolean dfs(ListNode head){
        if(head==null){
            return true;
        }
        if(dfs(head.next)){
            boolean flag=head.val==pre.val;
            pre=pre.next;
            return flag;
        }
        return false;
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-11 12:31
以前小时候我最痛恨出轨、偷情的人,无论男女,为什么会出轨?现在我成了自己最讨厌的人,没想到分享的东西在牛客会被这么多人看,大家的评价都很中肯,我也认同,想过一一回复,但我还是收声了,我想我应该说说这件事,这件事一直压在我心里,是个很大的心结,上面说了人为什么出轨,我大概能明白了。我们大一下半年开始恋爱,开始恋爱,我给出了我铭记3年的承诺,我对她好一辈子,我永远不会背叛,我责任心太重,我觉得跟了我,我就要照顾她一辈子,我们在一起3年我都没有碰过她,她说往东我就往东,她说什么我做什么,她要我干什么,我就干什么!在学校很美好,中途也出过一些小插曲,比如男闺蜜、男闺蜜2号等等等。但我都强迫她改掉了,我...
牛客刘北:两个缺爱的人是没有办法好好在一起的,但世界上哪有什么是非对错?你后悔你们在一起了,但是刚刚在一起的美好也是真的呀,因为其他人的出现,你开始想要了最开始的自己,你的确对不起自己,21岁的你望高物远,你完全可以不谈恋爱,去过你想要的生活,你向往自由,在一起之后,你要想的不是一个人,而是两个人,你不是变心了,就像你说的,你受够了,你不想包容了,冷静几天是你最优的选择,爱人先爱己。
社会教会你的第一课
点赞 评论 收藏
分享
06-25 09:33
厦门大学 Java
程序员饺子:现在日常估计没啥hc了,等到八月多估计就慢慢有了。双九✌🏻不用焦虑的
投递快手等公司7个岗位
点赞 评论 收藏
分享
07-11 11:15
中南大学 Java
好可爱的hr姐姐哈哈哈哈
黑皮白袜臭脚体育生:兄弟们貂蝉在一起,吕布开了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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