判断是否回文链表
题目 | 难度 | 要点 |
---|---|---|
回文链表 | ● | 栈或者后半段反转 |
栈
递归
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;
}