链表

回文链表

简单#234Java时间 O(n)空间 O(1)

题目要做什么

判断链表从前向后与从后向前读取是否相同。使用常数额外空间;本解法比较后恢复原链表。

题目示例输入head = [1,2,2,1]
题目示例输出true

01 为什么这样做

快慢指针找到前半段尾部,反转后半段后逐对比较。最后再次反转后半段,并接回原位置。

始终成立的条件

比较指针分别沿前半段正向、后半段反向前进。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public boolean isPalindrome(ListNode head) {3        if (head == null || head.next == null) return true;4        ListNode slow = head, fast = head;5        while (fast.next != null && fast.next.next != null) {6            slow = slow.next;7            fast = fast.next.next;8        }9        ListNode second = reverse(slow.next);10        ListNode a = head, b = second;11        boolean answer = true;12        while (b != null) {13            if (a.val != b.val) answer = false;14            a = a.next; b = b.next;15        }16        slow.next = reverse(second);17        return answer;18    }19    private ListNode reverse(ListNode current) {20        ListNode prev = null;21        while (current != null) {22            ListNode next = current.next;23            current.next = prev;24            prev = current; current = next;25        }26        return prev;27    }28}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索