欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 2025年- H31-Lc139- 242.回文链表(快慢指针)---java版--需2刷

2025年- H31-Lc139- 242.回文链表(快慢指针)---java版--需2刷

2025/5/19 5:12:48 来源:https://blog.csdn.net/zsysingapore/article/details/148051518  浏览:    关键词:2025年- H31-Lc139- 242.回文链表(快慢指针)---java版--需2刷

1.题目描述

在这里插入图片描述

2.思路

(1)将链表取中位数,分为左右两部分。
(2)右半部分的元素进行反转链表,能达到O(1)的空间复杂度
(3)再判断左右部分的元素,是否相等。如果相等,则是回文字符串

3.代码实现

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public boolean isPalindrome(ListNode head) {if (head == null || head.next == null) return true;//1.创建快慢指针,都从头节点出发ListNode slow=head;ListNode fast=head;//2.用快慢指针找中点, 访问指针前必须判断当前指针和下一个指针是否为 null,防止空指针异常。while(fast!=null&&fast.next!=null){slow=slow.next;// 走一步fast=fast.next.next; // 走两步//如果是偶数,慢指针会停留在前半部分的尾数上//如果是奇数,慢指针中位数上}// 第二步:反转后半部分链表(从 slow 开始)ListNode backHalf=reverseList(slow);// 第三步:从头和反转后的中点开始比较ListNode p1=head;ListNode p2=backHalf;while(p2!=null&&p1!=null){if(p2.val!=p1.val)//你只判断了 p2 != null,但 p1 可能提前变成了 null(尤其链表长度是奇数时){return false;}p1=p1.next;p2=p2.next;}return true;}// 辅助函数:反转链表private ListNode reverseList(ListNode head) {ListNode pre=null;ListNode curr=head;while(curr!=null)//while(curr != null),这样最后一个节点才能反转。{ListNode temp=curr.next;//暂存第二个节点//赋值,修改指针引用(现在==过去)。反转指针方向curr.next=pre;//整体移动指针,先移动指针,再移动值(继续下一个节点)pre=curr;curr=temp;}return pre;//指向的就是 反转后的新头节点
}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词