返回轨道
算法 · 2026-05-14 · 25 阅读

P14 判断单链表是否为回文链表

算法 25 阅读

信号摘要

难度:Easy · 时长:05:59 · leetcode 234 · lintcode 223

P14 判断单链表是否为回文链表

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一个单链表表示的数,你要判断它是不是一个回文数字。回文数字就是正着读和反着读都相同的数字。

比如说,给你的链表是:

4 -> 2

它表示 42,反过来是 24,不是一个回文数字,因此你要返回 false。

再比如说,给你的链表是:

4 -> 2 -> 2 -> 4

它表示 4224,反过来也是 4224,它是一个回文数字,因此你要返回 true。

代码

public class AlgoCasts {

  public class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
      val = x;
    }
  }

  // Time: O(n), Space: O(n)
  public boolean isPalindromeUsingStack(ListNode head) {
    Stack<Integer> s = new Stack<>();
    for (ListNode p = head; p != null; p = p.next)
      s.push(p.val);

    for (ListNode p = head; p != null; p = p.next)
      if (p.val != s.pop())
        return false;

    return true;
  }

  // Time: O(n), Space: O(1)
  public boolean isPalindromeReverseList(ListNode head) {
    int len = 0;
    for (ListNode p = head; p != null; p = p.next, ++len);

    // reverse half list
    ListNode cur = head, pre = null;
    for (int i = 0; i < len / 2; ++i) {
      ListNode next = cur.next;
      cur.next = pre;
      pre = cur;
      cur = next;
    }

    if (len % 2 == 1) cur = cur.next;
    for (; pre != null && cur != null; pre = pre.next, cur = cur.next) {
      if (pre.val != cur.val) return false;
    }
    return true;
  }

}

📡 通讯频道