方法一:先遍历一遍链表,得到节点数目count,再取第count-k个节点即可。
/*耗时24ms
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;}
}*/
public class Solution {public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k ==0)
{
return null;
}
ListNode end = head;
int count = 1;
while(end.next != null)
{
count++;
end = end.next;
}
if(count < k)
{
return null;
}
end = head;
for(int i =1;i<= count - k;i++)
{
end = end.next;
}
return end;
}
方法二:定义两个指针,均指向头结点,第一个指针先移动到第k个节点(即剩下节点长度为n-k),然后两个指针移动相同次数,直到第一个指针移到链表尾端,此时第二个指针指向第n-k,也就是倒数第k个节点。这就是快慢指针法。
/*耗时21ms
public class ListNode {int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k <=0)
{
return null;
}
ListNode node1 = head;
ListNode node2 = head;
for(int i = 1 ; i< k;i++)
{
node1 = node1.next;
if(node1 == null)
{
return null;
}
}
while(node1.next != null)
{
node1 = node1.next;
node2 = node2.next;
}
return node2;
}
}