题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路1
第一步:计算出链表长度
第二步:倒数第k个结点,就是正数第n+1-k个结点,从头开始找到
时间复杂度是O(n*n),要遍历两次链表。
- 注.1.第二步的时候是要从头开始走,注意head指针已经变了。2.找到第n+1-k个结点只需要从头结点开始走n-k步。
代码
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null){
return null;
}
if(k<=0){
return null;
}
ListNode first=head;
//1.长度记为i
int i=0;
while(head!=null){
i++;
head=head.next;
}
//2.倒数第K个是正数第i+1-k个,只需要从头结点开始走i-k步
if(k<=i){
for(int j=1;j<i+1-k;j++){
first=first.next;
}
return first;
}
return null;
}
}
解题思路2:
倒数第k个结点是正数第n+1-k个结点,也就是n-(k-1)个结点;遍历一次。
- 设置两个指针变量,都从第一个结点位置开始
- 快的比慢的早走k-1步,也就是先走到第k个结点的位置,之后一起走
- 快指针到达第n个结点(最后一个结点)的时候,慢指针比他慢k-1步,也就是到达了n-(k-1)个结点,也就是倒数第k个结点
代码
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null){
return null;
}
if(k<=0){
return null;
}
//1.设置两个指针
ListNode first=head;
ListNode second=head;
//2.快指针先走k-1步(排除会走到末尾的情况)
for(int i=1;i<k;i++){
if(first.next!=null){
first=first.next;
}else{
return null;
}
}
//2.快指针走到最后一个结点位置,慢指针所在的位置就是倒数第k个位置
while(first.next!=null){
first=first.next;
second=second.next;
}
return second;
}
}