通俗易懂帮你解决力扣234.回文链表

  1. 回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

在这里插入图片描述

提示:

  • 链表中节点数目在范围[1, 105]
  • 0 <= Node.val <= 9

**进阶:**你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

这道题很多人把链表的值放到一个数组中,然后通过双指针进行遍历来判断。这个方法是比较容易想起来的,因为我刚做过反转链表的题,因此立马就想到这道题与反转链表相关,解题方法就是将前半部分或者后半部分链表反转,然后将两段链表对比就可以了。

具体解题思路:

  1. 通过快慢指针对链表进行遍历,slow(慢指针)每次走一个,fast(快指针)每次走两个,当快指针结束时,慢指针走到后半部分链表的头部。

            while(fast!= null && fast.next!= null){
                help = slow;   //1
                slow = slow.next; //2
                fast = fast.next.next;//3
                help.next = node; //4
                node = help;//5
            }
    
  2. 将前半部分链表进行反转(上面代码的1、4、5已经对前半部分链表进行反转了)。

  3. 对比前半部分和后半部分链表

            while(help != null && slow != null){
              if(help.val != slow.val) return false;
              help = help.next;
              slow = slow.next;
            }
    

具体java实现代码:

class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null || head.next == null){
          return true;
        }
        ListNode slow = head;
        ListNode fast = head;
        ListNode help = head;
        ListNode node = null;
        while(fast!= null && fast.next!= null){
            help = slow;
            slow = slow.next;
            fast = fast.next.next;
            help.next = node;
            node = help;
        }
        if(fast != null){//这块内容是当链表个数为奇数时,因为上面遍历刚好slow到中间位置,再移动一次就到链表后半部分的首节点了!!!
          slow = slow.next;
        }

        while(help != null && slow != null){
          if(help.val != slow.val) return false;
          help = help.next;
          slow = slow.next;
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值