Leetcode234. 回文链表

本文详细解析了LeetCode第234题“回文链表”的解决方案,通过双指针技巧找到链表中间点,翻转后半部分链表,并对比前半与翻转后的后半部分,判断链表是否为回文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Leetcode234. 回文链表

请判断一个链表是否为回文链表。
示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

题解:

  1. 使用双指针,快指针走两步,慢指针走一步,当快指针走到最后时慢指针刚好走一半,找到中间点;
  2. 这样前半部分一个链表,后半部分为一个链表;
  3. 再对后半部分链表进行翻转;
  4. 对前半部分链表和翻转后的后半部分链表进行一一对比,如果有一个不相同,返回false,如果所有值都相同,则返回true

注意:
如果链表长度是偶数的话,前半部分和后半部分长度是一样的;
如果链表长度是奇数,那么前半部分的长度比后半部分长度多1个;
所以最后迭代链表的时候,以后半部分为准就可以了,当链表总长为奇数时,前半部分的最后一个节点就不会被遍历到了。

scala代码如下:

def isPalindrome(head: ListNode): Boolean = {
    var result = true
    if (head == null || head.next == null) {
      result
    } else {
      val p = new ListNode(-1)
      var fast = p
      var slow = p
      p.next = head
      //慢指针走一步,快指针走两步,当快指针到达终点,慢指针刚好处于中间位置
      while (fast != null && fast.next != null) {
        slow = slow.next
        fast = fast.next.next
      }
      //将快指针置于下半段链表中
      fast = slow.next
      //断开前后两个链表
      slow.next = null
      //慢指针置于上半段链表
      slow = p.next
      //翻转快链表
      var pre: ListNode = null // 保存指针前一节点的信息,用于反转
      while (fast != null) {
        val nextTmp = fast.next
        fast.next = pre
        pre = fast
        fast = nextTmp
      }

      //回文校验x
      // 前后半链表逐一比较,当链表长度为奇数时前半段链表长度比后半段多1,所以以后半段为准
      //将链表前半部分和反转的后半部分对比
      while (pre != null && slow != null && result) {
        if (slow.x != pre.x) {
          result = false
        }
        pre = pre.next
        slow = slow.next
      }
      result
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值