简述Java实现判断链表是否为回文 ?
参考答案:
要判断一个链表是否为回文,一个常见的策略是将链表的前半部分存储在一个数组中,然后检查链表的后半部分是否与数组中的元素反向相匹配。如果它们匹配,那么链表就是回文。
以下是一个简单的Java实现:
import java.util.ArrayList;
import java.util.List;
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
public static boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) {
return true;
}
List<Integer> list = new ArrayList<>();
ListNode slow = head;
ListNode fast = head;
// 将链表的前半部分存储到数组中
while (fast != null && fast.next != null) {
list.add(slow.val);
slow = slow.next;
fast = fast.next.next;
}
// 如果链表长度为奇数,需要去掉中间节点
if (fast != null) {
slow = slow.next;
}
// 检查链表的后半部分是否与数组中的元素反向相匹配
for (int i = list.size() - 1; slow != null; i--, slow = slow.next) {
if (list.get(i) != slow.val) {
return false;
}
}
return true;
}
public static void main(String[] args) {
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(2);
head.next.next.next.next = new ListNode(1);
System.out.println(isPalindrome(head)); // 输出 true
}
}
这个实现的时间复杂度是O(n),其中n是链表的长度,因为我们需要遍历链表两次。空间复杂度也是O(n),因为我们需要存储链表的前半部分。
注意,这个实现假设链表中没有重复的元素。如果链表中可能有重复的元素,那么你可能需要使用一个更复杂的数据结构(如HashSet)来存储链表的元素,以便在O(1)的时间内检查一个元素是否已经出现过。