判断是否回文链表

题目 难度 要点
回文链表 栈或者后半段反转

递归

class Solution {

    ListNode node;

    public boolean isPalindrome(ListNode head) {
        node = head;
        return traverse(head);
    }

    public boolean traverse(ListNode head) {
        if (head == null) return true;
        boolean res = traverse(head.next) && node.val == head.val;
        node = node.next;
        return res;
    }

}

迭代

public boolean isPalindrome(ListNode head) {
        if (head == null) return true;
        Stack<ListNode> stack = new Stack<>();
        ListNode p = head;
        while (p != null) {
            stack.add(p);
            p = p.next;
        }
        while (!stack.isEmpty()) {
            if (stack.pop().val != head.val)
                return false;
            head = head.next;
        }
        return true;
    }

后半段反转

建议用这种解法,避免了栈的O(n)空间

public boolean isPalindrome(ListNode head) {
        if (head == null) return true;
        ListNode slow = head, fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        if (fast != null) {
            slow = slow.next;
        }
        ListNode left = head, right = reverseList(slow);
        while (right != null) {
            if (left.val != right.val)
                return false;
            left = left.next;
            right = right.next;
        }
        return true;
    }

    public ListNode reverseList(ListNode node)
 {
     ListNode pre = null, cur = node, nxt;
     while (cur != null) {
         nxt = cur.next;
         cur.next = pre;
         pre = cur;
         cur = nxt;
     }
     return pre;
 }
posted @ 2023-03-01 20:06  kiper  阅读(14)  评论(0编辑  收藏  举报