题目描述:给你一个单链表的头节点 ,请你判断该链表是否为回文链表。如果是,返回 ;否则,返回 。
获得更多?算法思路:代码文档,算法解析的私得。
![在这里插入图片描述](https://img-blog.csdnimg.cn/0a67a53947694b9baa15f0902d903dc7.png
完整代码
/**
* 2 * @Author: LJJ
* 3 * @Date: 2023/7/31 14:24
* 4
*/
class ListNode{
int val;
ListNode next;
ListNode(int val){
this.val = val;
}
}
public class PalindromeLinkedList {
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 reverseHalf = reverseList(slow);
//将前半部分和反转后的后半部分进行比较
ListNode p1 = head;
ListNode p2 = reverseHalf;
while (p1 != null && p2 !=null){
if (p1.val != p2.val){
return false; // 如果节点的值不相等,则链表不是回文的
}
p1 = p1.next;
p2 = p2.next;
}
return true;
}
// 反转链表的函数
private static ListNode reverseList(ListNode head){
ListNode prev = null;
ListNode curr = head;
while (curr != null){
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
// 打印链表的函数
private static void printList(ListNode head) {
ListNode node = head;
while (node != null) {
System.out.print(node.val);
if (node.next != null) {
System.out.print(" -> ");
}
node = node.next;
}
System.out.println(" -> null");
}
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("原始链表:");
printList(head);
// 判断是否为回文链表
boolean isPalindrome = isPalindrome(head);
// 输出结果
System.out.println("是否为回文链表:" + isPalindrome);
}
}