解法一、头插法建立新链表
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode newHead = reverse(head);
while(head != null) {
if(head.val != newHead.val) {
return false;
}
head = head.next;
newHead = newHead.next;
}
return true;
}
public ListNode reverse(ListNode head) {
ListNode newHead = null;
while(head != null) {
ListNode node = new ListNode(head.val);
node.next = newHead;
newHead = node;
head = head.next;
}
return newHead;
}
}
运行截图:
解法二、中间结点+链表反转
class Solution {
public boolean isPalindrome(ListNode A) {
ListNode middle = middleNode(A);
ListNode B = reverse(middle);
while(A != null && B != null) {
if(A.val != B.val) {
return false;
}
A = A.next;
B = B.next;
}
return true;
}
public ListNode middleNode(ListNode head) {
ListNode low = head,fast = head;
while(fast != null && fast.next != null) {
low = low.next;
fast = fast.next.next;
}
return low;
}
public ListNode reverse(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode tmpNext = head.next;
ListNode newHead = reverse(head.next);
tmpNext.next = head;
head.next = null;
return newHead;
}
}
运行截图: