题目描述:
输入一个链表,输出该链表中倒数第k个结点。
示例1
输入
1,{1,2,3,4,5}
返回值
{5}
方法一:单指针
倒数第k个,就是整数第 len - k + 1 个,需要移动结点len - k次
遍历两次,一求链表长度,二移动指针求结点
时间复杂度:O(N),
空间复杂度:O(1)
/*
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 cur = head;
int len = 0;
while(cur != null){
len++;
cur = cur.next;
}//遍历求长度
if( k > len){
return null;
}//k大于真实链表长度的情况
ListNode cur1 = head;
int move = 0;
while(move < len - k){
cur1 = cur1.next;
move++;
}
return cur1;
}
}
方法二:快慢指针
求倒数第k个,就先让fast指针先走k-1次;
然后fast与slow再一起走,这样当fast走到尾结点时,slow就是所求的。
/*
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 fast = head;
ListNode slow = head;
while(k-- != 0){
if(fast != null){
fast = fast.next;
}else return null;
}
while(fast != null ){
fast = fast.next;
slow = slow.next;
}
return slow;
}
}