第一种方法:直接用集合判断值是否相等,时间复杂度O(n),空间复杂度O(n)
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
public boolean isPail (ListNode head) {
// write code here
if (head == null) {
return true;
}
ArrayList<Integer> list = new ArrayList<>();
while (head != null) {
list.add(head.val);
head = head.next;
}
int size = list.size(), mid = size / 2, start = 0, end = 0;
for (int i = 0 ; i < mid; i++) {
start = list.get(i);
end = list.get((size - i - 1));
if (start != end) {
return false;
}
}
return true;
}
}
方法二:利用回文正序和倒序一样的特点,可以把整个链表反转,然后在逐一比较链表的值,这种方式需要生成一个新的链表,故时间复杂度O(n),空间复杂度O(n)
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
public boolean isPail (ListNode head) {
// write code here
if (head == null) {
return true;
}
ListNode tmp1 = head;
ListNode head1 = copyHead(tmp1);
ListNode head2 = reverse(head);
while (head1 != null) {
if (head1.val != head2.val) {
return false;
}
head1 = head1.next;
head2 = head2.next;
}
return true;
}
private ListNode copyHead(ListNode head) {
ListNode pre = new ListNode(-1);
ListNode result = pre;
ListNode node = null;
while (head != null) {
node = new ListNode(head.val);
pre.next = node;
pre = pre.next;
head = head.next;
}
return result.next;
}
private ListNode reverse(ListNode head) {
ListNode pre = null;
ListNode tmp = null;
while (head != null) {
tmp = head.next;
head.next = pre;
pre = head;
head = tmp;
}
return pre;
}
}
方法三:快慢指针+反转链表的方式,时间复杂度O(n),空间复杂度O(1)
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
public boolean isPail (ListNode head) {
// write code here
if (head == null || head.next == null) {
return true;
}
ListNode fast = head.next;
ListNode slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode tmp = slow.next;
slow.next = null;
ListNode node = reverse(tmp);
while (node != null) {
if (node.val != head.val) {
return false;
}
node = node.next;
head = head.next;
}
return true;
}
private ListNode reverse(ListNode head) {
ListNode pre = null;
ListNode node = null;
while (head != null) {
node = head.next;
head.next = pre;
pre = head;
head = node;
}
return pre;
}
}