求倒数第k个结点
方法1:先求长度,然后再减去k,再重新遍历
特殊性:链表长度 == k 或者 <k 的时候
//求倒数第K个结点
public ListNode FindKthToTail(ListNode head,int k){
int length=0;
for(ListNode cur=head;cur!=null;cur=cur.next){
length++;
}
if(length<k){
return null;
}
int n=length-k;
ListNode kth=head;
for(int i=0;i<n;i++){
kth=kth.next;
}
return kth;
}
测试代码
//方法2 双引用遍历
public ListNode FindKthToTail2(ListNode head,int k){
ListNode front=head;
ListNode back=head;
for(int i=0;i<k;i++){
if(front==null){
return null;
}
front=front.next;
}
while(front!=null){
front=front.next;
back=back.next;
}
return back;
}
}
方法2:双引用遍历
以我的理解,就是让一个先走相差的步数,再两个引用同时遍历,使得慢引用刚好到所求位置
个人理解的图
//方法2 双引用遍历
public ListNode FindKthToTail2(ListNode head,int k){
ListNode front=head;
ListNode back=head;
for(int i=0;i<k;i++){
if(front==null){
return null;
}
front=front.next;
}
while(front!=null){
front=front.next;
back=back.next;
}
return back;
}
}
测试代码
public static void testFindKthToTail2(){
System.out.println("测试倒数第k个元素");
ListNode n1=new ListNode(1);
ListNode n2=new ListNode(2);
ListNode n3=new ListNode(3);
ListNode n4=new ListNode(4);
ListNode n5=new ListNode(5);
n1.next=n2;
n2.next=n3;
n3.next=n4;
n4.next=n5;
n5.next=null;
Solution s=new Solution();
ListNode result=s.FindKthToTail2(n1,5);
display1(result);
}
结果如下
测试倒数第k个元素
(1)
测试倒数第k个元素
(1)

被折叠的 条评论
为什么被折叠?



