美文网首页数据结构和算法
链表 - LeetCode 234.回文链表(快慢指针)

链表 - LeetCode 234.回文链表(快慢指针)

作者: 我阿郑 | 来源:发表于2023-11-21 10:52 被阅读0次

给定一个链表的 头节点 head ,请判断其是否为回文链表。

如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

输入: head = [1,2,3,3,2,1]
输出: true

输入: head = [1,2]
输出: false

解题思路:
第一步:先找链表中位
第二步:反转中位的后半部分链表,得到反转后链表的head
第三步:判断回文

class Solution {
    public boolean isPalindrome(ListNode head) {

 if (head == null) {
            return true;
        }

        // 第一步:先找链表中位
        ListNode leftHalfEnd = middleNode(head);
        // 第二步:反转中位的后半部分链表,得到反转后链表的head
        ListNode rightHalfHead = reverseList(leftHalfEnd.next);
        // 第三步:判断回文
        ListNode p1 = head;
        ListNode p2 = rightHalfHead;
        boolean result = true; // 默认p1、p2指向的节点值相等
        // p2链表节点个数,一定小于等于p1链表节点个数,所以这里条件是 p2 != null
        while(result && p2 != null) {
            if(p1.val != p2.val){
                result = false;
            }
            p1 = p1.next;
            p2 = p2.next;
        }
        return result;
    }

    private ListNode middleNode(ListNode head){
        // 设置快慢指针开始都指向head
        ListNode slow = head;
        ListNode fast = head;

        // 同时移动:slow一次一步,fast一次两步
        // 必须保证fast能移动2步时,才移动,所以要判断 fast.next != null && fast.next.next != null
        while(fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        // 最后slow指向节点就是中间节点
        return slow;
    } 

   // 反转链表,返回反转后链表的head
    private ListNode reverseList(ListNode head){
        ListNode cur = head;
        ListNode pre = null;
        while(cur != null){
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

画图理解:

  • 第一步:先找链表中位
    • 链表节点个数为奇数的情况
    • 链表节点个数为偶数的情况
image.png

此时,slow所指节点就是中位节点。接着进行第二步,反转中位节点后的链表,以奇数链表为例:

image.png

接着,第三步:判断回文。

每次移动都判断当前 P1P2 指针指向的节点值是否相同。

P2指向节点个数,一定小于等于 P1指向节点个数。

  • 如果链表节点个数位奇数, P1节点个数 > P2节点个数 (比如 3 > 2 )
  • 如果链表节点个数位偶数, P1节点个数 == P2节点个数 (比如 都是3 )
image.png
  • 如果相同就继续移动
  • 如果不同,就return false

相关文章

  • 234. 回文链表

    234. 回文链表[https://leetcode.cn/problems/palindrome-linked-...

  • LeetCodeEmm

    234. 回文链表[https://leetcode-cn.com/problems/palindrome-lin...

  • 234. 回文链表

    234. 回文链表[https://leetcode-cn.com/problems/palindrome-lin...

  • Leetcode 234 回文链表

    234. 回文链表[https://leetcode-cn.com/problems/palindrome-lin...

  • LeetCode 234. 回文链表

    234. 回文链表 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2输出: false 示例 2: 输...

  • 漫谈递归-回文链表

    题目 234. 回文链表请判断一个链表是否为回文链表。 测试 示例 1:输入: 1->2输出: false 示例 ...

  • 如何判断回文链表

    读完本文,你可以去力扣拿下如下题目: 234.回文链表[https://leetcode-cn.com/probl...

  • 234. Palindrome Linked List

    判断一个链表是不是回文链表 获取链表的中点,根据快慢指针,将后半部分反转,然后从中点逐个比较。 Runtime: ...

  • LeetCodeDay13 —— 回文链表&环形链表

    234. 回文链表 描述 请检查一个链表是否为回文链表。 进阶 你能在 O(n) 的时间和 O(1) 的额外空间中...

  • 算法学习--双指针

    双指针分类 快慢指针 左右指针 快慢指针:主要解决链表相关问题,比如:典型的判断链表中是否包含环、链表倒是第K个节...

网友评论

    本文标题:链表 - LeetCode 234.回文链表(快慢指针)

    本文链接:https://www.haomeiwen.com/subject/qbuswdtx.html