题目描述
输入一个链表,输出该链表中倒数第k个结点。
方法一
【解题思路】
循环两次。第一次统计链表总数n
第二次倒数第k个,即输出正数第n-k+1个
特殊情况:k>n时,返回null
/*
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 p = head;
ListNode q = head;
int count = 0;
//统计结点个数
while(p!=null){
count++;
p = p.next;
}
//注意!!k>链表总数时,返回空=null
if(k>count){
return null;
}
//倒数第k个,即正数第count-k+1
count = count - k + 1 ;
//再次循环,输出第count个,这里注意循环条件
int m = 1;
while(m<count){
q = q.next;
m++;
}
return q;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
方法二
【解题思路】
快慢指针。
初始化:快指针 i 指向 正数 第k+1个结点,慢指针 j 指向第一个结点
两个指针同时向前移动,当快指针 i 指向空的时候,慢指针正好指向倒数第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 p = head; //快指针
ListNode q = head; //慢指针
k = k+1;
int count = 1;
//快指针指向第k+1个,注意循环条件
while(count < k){
if(p == null)
return null;
count++;
p = p.next;
}
while(p!=null)
{
p = p.next;
q = q.next;
}
return q;
}
}
时间复杂度:O(n)
空间复杂度:O(1)