判断一个链表是否是回文链表Java

题目要求:
给定一个单链表,请判断该链表是否是一个回文链表。所谓回文链表,就是链表从前往后和从后往前是一样的。
例如:
1、2、2、1 就是一个回文链表
1、2、1、1 就不是一个回文链表

常规思路:
这题的常规思路比较容易,因为所谓回文就是倒序仍然一样,那么,就想办法倒叙就可以了。想到倒叙,什么数据结构会导致倒叙?没错,就是栈,先进后出。因此,用一个辅助栈,把链表元素依次入栈,然后,再依次出栈,一个个比较出栈元素和链表从头遍历的元素是否相同,就可以判断是否是回文链表。
注意: 常规思路是需要一个辅助栈的,因此空间复杂度为O(n),一般笔试中推荐使用常规思路。

代码:

public static boolean isPallindrome(singleLink node){
        Stack stack=new Stack();
        singleLink index=node;
        while (index!=null){
            stack.push(index.value);
            index=index.next;
        }
        while (node!=null){
            if(node.value!=stack.pop()){
                return false;
            }
            node=node.next;
        }
        return true;
    }

特殊思路:
在面试中,一般会问特殊思路,比如在空间复杂度O(1)的前提下,判断回文链表。
特殊思路,使用快慢指针,快指针一次跑两步,慢指针每次跑一步,当快指针到达终点时,慢指针到达中间。然后,翻转后半部分的链表,然后依次从头指针向后遍历,同时,慢指针指向的中间也往后遍历,依次对比,如果全部相同,就是回文链表。最后要记得,把后半部分翻转后的链表在翻转回原状。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值