Java 链表回文判断:快慢指针与反转实现
使用快慢指针来判断回文链表。
首先,使用快慢指针找到链表的中间节点。快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达链表末尾时,慢指针刚好到达链表的中间位置。
然后,将链表的后半部分进行反转。
最后,从链表的头部和中间位置开始同时遍历链表,比较对应位置的节点的值是否相等。如果所有节点的值都相等,则链表为回文链表;否则,链表不是回文链表。
以下是具体的Java代码实现:
public class PalindromeLinkedList {
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) {
return true;
}
ListNode slow = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
ListNode secondHalfHead = reverseList(slow.next);
ListNode p1 = head;
ListNode p2 = secondHalfHead;
while (p2 != null) {
if (p1.val != p2.val) {
return false;
}
p1 = p1.next;
p2 = p2.next;
}
return true;
}
private ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
}
其中,ListNode是表示链表节点的类,其定义如下:
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
需要注意的是,该方法会修改原始链表的结构,如果不允许修改原始链表,可以先将链表复制一份再进行操作。
原文地址: https://www.cveoy.top/t/topic/cQRi 著作权归作者所有。请勿转载和采集!