📅  最后修改于: 2023-12-03 15:11:18.688000             🧑  作者: Mango
这是一个Java程序,用于检查给定的链表是否为回文。
回文链表是指,一个单向链表的正反遍历都能够获得相同的值序列。例如,以下三种链表都是回文链表:
这个程序的实现原理很简单:用两个指针,一个快指针和一个慢指针,从链表的头开始遍历。慢指针每次移动一个节点,而快指针每次移动两个节点。
当快指针遍历到链表的末尾时,慢指针的位置就指向链表的中间节点。然后,我们将慢指针的后面一半链表进行反转,再用两个指针分别从链表的头和中间节点开始遍历比较。如果两个指针遍历到的节点值都相等,那么这个链表就是回文的。
以下是实现上述算法的Java代码:
public class LinkedListPalindromeChecker {
public static boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) {
return true;
}
// 快慢指针寻找链表的中间节点
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// 反转后面一半链表
ListNode pre = null;
ListNode cur = slow;
while (cur != null) {
ListNode nextTemp = cur.next;
cur.next = pre;
pre = cur;
cur = nextTemp;
}
// 比较两个指针遍历到的节点值是否相等
ListNode p1 = head;
ListNode p2 = pre;
while (p2 != null) {
if (p1.val != p2.val) {
return false;
}
p1 = p1.next;
p2 = p2.next;
}
return true;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
可以创建一些自定义的测试用例进行测试,例如:
public static void main(String[] args) {
ListNode head1 = new ListNode(1);
head1.next = new ListNode(2);
head1.next.next = new ListNode(3);
head1.next.next.next = new ListNode(2);
head1.next.next.next.next = new ListNode(1);
System.out.println(LinkedListPalindromeChecker.isPalindrome(head1)); // true
ListNode head2 = new ListNode(1);
head2.next = new ListNode(2);
head2.next.next = new ListNode(3);
head2.next.next.next = new ListNode(3);
head2.next.next.next.next = new ListNode(2);
head2.next.next.next.next.next = new ListNode(1);
System.out.println(LinkedListPalindromeChecker.isPalindrome(head2)); // true
ListNode head3 = new ListNode(1);
head3.next = new ListNode(3);
head3.next.next = new ListNode(3);
head3.next.next.next = new ListNode(1);
System.out.println(LinkedListPalindromeChecker.isPalindrome(head3)); // true
ListNode head4 = new ListNode(1);
head4.next = new ListNode(2);
System.out.println(LinkedListPalindromeChecker.isPalindrome(head4)); // false
}