小学生都能懂的题解 | #判断一个链表是否为回文结构#

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

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

问题描述

假设你有一串珠子,每颗珠子上都有一个数字。我们要检查这串珠子上的数字是不是回文结构。回文的意思就是,无论你从前往后读还是从后往前读,这些数字都是一样的。

解决方法

我们可以用几个步骤来检查这串珠子是否是回文的:

1. 找到中间的珠子

我们先找到这串珠子的中间位置。就像你有一条绳子,我们要找到它的中心点。我们可以用两只手来帮忙找:

  • 一只手每次移动一颗珠子(慢手)。
  • 另一只手每次移动两颗珠子(快手)。
  • 当快手无法再移动时,慢手就在中间位置了。

2. 把后面的珠子反过来

找到中间位置后,我们把后面的珠子反过来,就像把一条项链的后半部分反过来一样。

3. 比较前后两部分

然后,我们比较前面的珠子和反过来的后面珠子,看看它们的数字是否一一对应相等。

具体步骤

假设你有这样一串珠子:1, 2, 2, 1

  1. 找到中间点
  2. 我们发现中间点是 2
  3. 把后面的珠子反过来
  4. 变成 1, 2, 2 和 1
  5. 比较前后两部分
  6. 第一颗珠子:1 和 1 相等。
  7. 第二颗珠子:2 和 2 相等。所有的珠子都相等,所以这串珠子是回文的!

示例

示例1

输入:{1}

  • 中间点就是 1
  • 反转后的链表:1
  • 比较:1 和 1 相等。
  • 结论:是回文。

示例2

输入:{2, 1}

  • 中间点是 1
  • 反转后的链表:2 和 1
  • 比较:2 和 1 不相等。
  • 结论:不是回文。

示例3

输入:{1, 2, 2, 1}

  • 中间点是 2
  • 反转后的链表:1, 2, 2 和 1
  • 比较:1 和 1 相等,2 和 2 相等。
  • 结论:是回文。

代码实现

下面是一个简单的 Java 实现:

public class Solution {

    // 检查链表是否为回文
    public boolean isPalindrome(ListNode head) {
        // 如果链表为空或只有一个节点,它是回文
        if (head == null || head.next == null) {
            return true;
        }

        // 找到中间节点
        ListNode middle = findMiddle(head);
        ListNode secondHalf = reverse(middle);

        // 比较前半部分和反转后的后半部分
        ListNode firstHalf = head;
        while (secondHalf != null) {
            if (firstHalf.val != secondHalf.val) {
                return false; // 数字不同,不是回文
            }
            firstHalf = firstHalf.next;
            secondHalf = secondHalf.next;
        }

        return true; // 所有数字相同,是回文
    }

    // 寻找中间节点
    private ListNode findMiddle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;

        while (fast != null && fast.next != null) {
            slow = slow.next; // 慢指针
            fast = fast.next.next; // 快指针
        }

        return slow;
    }

    // 反转链表
    private ListNode reverse(ListNode head) {
        ListNode previous = null;
        ListNode current = head;

        while (current != null) {
            ListNode next = current.next;
            current.next = previous;
            previous = current;
            current = next;
        }

        return previous;
    }
}

如果这篇文章帮到你,请点个免费的👍,让它帮助更多的人。

#牛客创作赏金赛#
小学生都能看懂的算法 文章被收录于专栏

主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。

全部评论

相关推荐

头像
11-27 14:28
长沙理工大学
刷算法真的是提升代码能力最快的方法吗? 刷算法真的是提升代码能力最快的方法吗?
牛牛不会牛泪:看你想提升什么,代码能力太宽泛了,是想提升算法能力还是工程能力? 工程能力做项目找实习,算法也分数据结构算法题和深度学习之类算法
点赞 评论 收藏
分享
10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务