解法一
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) {
return true;
}
int length = getLength(head);
int[] nums1 = new int[length];
int[] nums2 = new int[length];
ListNode current1 = head;
for (int i = 0; i < length; ++i) {
nums1[i] = current1.val;
current1 = current1.next;
}
ListNode current2 = reverse(head);
for (int i = 0; i < length; ++i) {
nums2[i] = current2.val;
current2 = current2.next;
}
return Arrays.equals(nums1, nums2);
}
public int getLength(ListNode head) {
int length = 1;
ListNode current = head;
while(current.next != null) {
++length;
current = current.next;
}
return length;
}
public ListNode reverse(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode newHead = reverse(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}
解法二
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
StringBuilder builder = new StringBuilder();
ListNode pre = head;
while (pre != null) {
builder.append(pre.val);
pre = pre.next;
}
return builder.toString().equals(builder.reverse().toString());
}
}
解法三
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
List<Integer> vals = new ArrayList<Integer>();
// 将链表的值复制到数组中
ListNode currentNode = head;
while (currentNode != null) {
vals.add(currentNode.val);
currentNode = currentNode.next;
}
// 使用双指针判断是否回文
int front = 0;
int back = vals.size() - 1;
while (front < back) {
if (!vals.get(front).equals(vals.get(back))) {
return false;
}
front++;
back--;
}
return true;
}
}
解法四
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) return true;
int num1 = 0, num2 = 0, t = 1;
while (head != null) {
num1 = num1 * 10 + head.val;
num2 = num2 + head.val * t;
t = t * 10;
head = head.next;
}
return num1 == num2;
}
}
来源:LeetCode