思路
给定一个根节点(假设不为null),用两个指针p1(指向根节点)和p2(指向根节点的下一个节点),如果下一个节点(p2.next)为空,则无法满足快指针跳两步的需求了,如果不为空且再往后一个节点也不为空(p2.next.next),那么可以满足快指针跳两部的需求,快慢指针均移动,否则结束。
代码
//先使用快慢指针找到中间节点
ListNode fast=head,slow=head;
while(fast.next!=null){
//如果快指针下一个节点不为空,判断是否有下一个
if(fast.next.next==null){
//让慢指针再前进一步,相当于是到达了中间节点的下一个节点
slow=slow.next;
break;
}
fast=fast.next.next;
slow=slow.next;
}
应用:力扣-234. 回文链表
完整代码:
/**
* 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,slow=head;
while(fast.next!=null){
//如果快指针下一个节点不为空,判断是否有下一个
if(fast.next.next==null){
slow=slow.next;
break;
}
fast=fast.next.next;
slow=slow.next;
}
//进行反转
ListNode p1=slow,p2=slow.next;
p1.next=null;
while(p2!=null){
ListNode temp=p2.next;
p2.next=p1;
p1=p2;
p2=temp;
}
//进行比较
while(p1!=null){
if(p1.val!=head.val){
return false;
}
p1=p1.next;
head=head.next;
}
return true;
}
}