1、源代码
class Solution {public boolean isPalindrome(ListNode head) {ListNode fast=head,slow=head; //快慢指针都在头结点//快指针走2步,慢指针走一步。//双数快指针最后是null,单数快指针下一位是nullwhile(fast!=null && fast.next!=null){fast=fast.next.next;slow=slow.next;}//移动之后,如果是奇数。此时slow在中位数,要向下移动一位if(fast!=null){slow=slow.next;}slow=reverse(slow);//反转链表fast=head;//反转之后快指针回到头结点//对值进行比较while(slow!=null){if(fast.val!=slow.val){return false;}fast=fast.next;slow=slow.next;}return true;}/*反转链表*/public ListNode reverse(ListNode curr){ListNode pre=null;while(curr!=null){ListNode next=curr.next;curr.next=pre;pre=curr;curr=next;}return pre;}
}
2、解析
1、题目
2、思路
我们把整个链表看成镜像,因此我们只需要把左右进行对比,这样就会出现一个奇偶数问题,因此判断方法采用快慢指针
快指针一次走2步,慢指针一次走一步,当快指针走到null代表为偶数,快指针的next是null代表为奇数,因此得到以下代码
while(fast!=null && fast.next!=null){fast=fast.next.next;slow=slow.next;
}
移动之后,如果是奇数。此时slow在中位数,要向下移动一位,因为中位数是谁都无所谓
if(fast!=null){slow=slow.next;
}
然后就需要把后半段链表进行反转,此时要把快指针放到头结点
slow=reverse(slow);//反转链表
fast=head;//反转之后快指针回到头结点
反转链表代码:
public ListNode reverse(ListNode curr){ListNode pre=null;//这个为curr的前一个节点while(curr!=null){ListNode next=curr.next; //保存当前指针的下一个curr.next=pre; //把curr的next变成前一个(反转核心)pre=curr; //把pre移动到currcurr=next;//把curr移动到next}return pre;
}
然后一一进行值对比,如果对不上直接false
while(slow!=null){if(fast.val!=slow.val){return false;}fast=fast.next;slow=slow.next;
}
return true;