题目:输入一个链表,输出该链表中倒数第k个结点
思路:(第一种)先求出长度,len-k,就是倒数第k个结点
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
int len=0;
for(ListNode cur=head;cur!=null;cur=cur.next){//求长度
len++;
}
if(len<k){//如果k比len大,则这个结点在该链表中找不到
return null;
}
int steps=len-k;//走len-k步就可以走到那一步
ListNode r=head;
for(int i=0;i<steps;i++){
r=r.next;//!!!
}
return r;
}
}
思路:(第二种)一个快引用先走k步后慢引用开始走,等快引用走到终点后,慢引用刚好在倒数第k个结点处
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode front=head;//快的从头结点开始
ListNode back=head;//慢的从头结点开始
for(int i=0;i<k;i++){//快引用先走k步
if(front==null){
return null;
}
front=front.next;
}
while(front!=null){//然后快引用和慢引用同时从当前位置走,当快引用遇到null时,慢引用就是倒数第k个结点
back=back.next;
front=front.next;
}
return back;
}
}