问题描述
思路分析
一开始我想的是前几天刚做完反转链表,将链表反转然后在进行比较;代码如下,遇到[1,2]的测试死了,我也没搞清楚哪里不对;
class Solution {
public boolean isPalindrome(ListNode head) {
if(head.next == null)
return true;
ListNode node = head;
ListNode node2 = reverse(head);
while (node != null) {
if (node.val != node2.val)
return false;
node = node.next;
node2 = node2.next;
}
return true;
}
public ListNode reverse(ListNode head) {
ListNode pre = null;
ListNode cur = head;
ListNode temp = null;
while (cur != null) {
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
后来看了题解,有人用快慢指针,有人用栈,指针那个需要四个,只大致看了一下思路,选了一直没用过的栈。
栈的特点,先进后出,完美适合这个需要反转的题。
把链表的值存到栈里,然后开始比较,但我一直不经常注意的是**边界!**边界的考虑是每个问题都需要先做的,栈的代码如下:
class Solution {
public boolean isPalindrome(ListNode head) {
Stack<ListNode> que = new Stack<ListNode>();
ListNode node = head;
while(node != null){
que.push(node);
node = node.next;
}
node = head;//需要注意,一开始这个地方我没有给他重新连到原始链表,出现了[1,2]不通过测试的情况。
while(node != null){
if(node.val != que.pop().val)
return false;
node = node.next;
}
return true;
}
}