链表查找某个结点问题,定义两个指针,一个快,一个慢。
1)第一个指针从头开始向前走k-1,第二个指针在头部
2)从k步开始,两个指针同时开始走,当第一个到达尾部,第二个到达第k个结点。
起始状态:第1步
pAhead
pBhead
第2步:相差K-1个结点
pAhead
pBhead
public class LastK {
public ListNode FindKthToTail(ListNode head,int k) {if(head==null || k==0){return null;}
ListNode pAhead = head;
ListNode pBhead = head;
for(int i =0;i<k-1;i++){ //第一个指针从头开始向前走k-1
if(pAhead.next!=null){
pAhead = pAhead.next;
}else{
return null;
}
}
while(pAhead.next!=null){ //两个指针同时开始走
pAhead = pAhead.next;
pBhead = pBhead.next;
}
return pBhead;
}
int k=2;
ListNode head=new ListNode(0);
ListNode[] pNode=new ListNode[6];
for (int i = 0; i < pNode.length; i++) {
pNode[i]=new ListNode(i+1);
if(i>0)
pNode[i-1].next=pNode[i];
else {
head.next=pNode[0];
}
}
LastK last=new LastK();
ListNode res=last.FindKthToTail(head, k);
System.out.println(res.key);
}
}