链接
解法一
先将链表进行反转,然后对其 val 进行依次判断,不同则返回 false
这里注意:反转的时候要用一个副本来进行反转,否则会对后续判断造成影响
代码
class Solution {
public boolean isPalindrome(ListNode head)
{
if (head == null || head.next == null)
{
return true;
}
//head 必不为空,拷贝一个副本用来进行反转
ListNode cur = head.next;
ListNode newHead = new ListNode(head.val);
ListNode newCur = newHead;
while (cur != null)
{
newCur.next = new ListNode(cur.val);
newCur = newCur.next;
cur = cur.next;
}
//将链表反转
ListNode pa = head, pb = reverseList(newHead);
while (pa != null && pb != null)
{
if (pa.val != pb.val)
{
return false;
}
pa = pa.next;
pb = pb.next;
}
return true;
}
public ListNode reverseList(ListNode head)
{
if (head == null || head.next == null)
{
return head;
}
ListNode cur = head;
ListNode prev = null;
ListNode newHead = null;
while (cur != null)
{
ListNode temp = cur.next;
cur.next = prev;
if (temp == null)
{
newHead = cur;
}
prev = cur;
cur = temp;
}
return newHead;
}
}
解法二
利用栈先进后出的特性,先将链表中的 val 全部入栈,然后进行出栈并与链表 val 进行比较
代码
class Solution {
//用栈操作:栈先进后出,让链表的结点依次入栈
public boolean isPalindrome(ListNode head)
{
if (head == null || head.next == null)
{
return true;
}
Stack<Integer> stack = new Stack<>();
ListNode cur = head;
while (cur != null)
{
stack.push(cur.val);
cur = cur.next;
}
//判断
cur = head;
while (!stack.isEmpty())
{
//出栈
if (stack.pop() != cur.val)
{
return false;
}
cur = cur.next;
}
return true;
}
}