题目来源:
leetcode题目,网址:LCR 027. 回文链表 - 力扣(LeetCode)
解题思路:
使用快慢指针遍历链表的同时记录快指针移动次数的奇偶性及反转慢指针指向节点之前的所有节点。然后根据针移动次数的奇偶性得出链表长度的奇偶性并以此得到中间节点的位置,最后遍历两链表(slow 指针及其之前的节点构成的反转链表的子链表,slow指针之后节点构成的链表)判断是否相等即可。
解题代码:
- /**
- * 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) {
- ListNode fast=head; //fast 每次移动一下
- ListNode slow=head; //slow 每次移动两下,slow指向发转
- ListNode pre=null;
- boolean even=false; //默认链表长度为偶数
- while(true){
- fast=fast.next;
- if(fast==null){
- even=true;
- break;
- }
- fast=fast.next;
- if(fast==null){
- break;
- }
- ListNode next=slow.next;
- slow.next=pre;
- pre=slow;
- slow=next;
- }
- ListNode latHalf=slow.next;
- slow.next=pre;
- ListNode preHalf=slow;
- if(even){
- preHalf=slow.next;
- }
- while(preHalf!=null && latHalf!=null){
- if(preHalf.val!=latHalf.val){
- return false;
- }
- preHalf=preHalf.next;
- latHalf=latHalf.next;
- }
- return true;
-
- }
- }
总结:
官方题解给出了复制到数组后判断,递归及快慢指针三种解法。