题目描述
输入一个链表,输出该链表中倒数第k个结点。
输入
1,{1,2,3,4,5}
返回值
{5}
想法:
做法一:
第一时间想到的做法是先遍历一遍链表统计链表的长度计为n
在设置一个指针走(n-k)步,就可以找到链表倒数第k个结点
但是这种做法需要遍历链表两次
第一次统计链表中结点的个数,第二次找到倒数第k个结点,时间复杂度高
除了这个还有这个时间复杂度低的做法
做法二
双指针
使用双指针就可以不用统计链表的长度
准备一个前指针first和一个后指针later,都指向链表的头结点head
让后指针先走k步,结束后前指针和后指针相距k步
然后双指针共同移动,双指针first和later每轮都向前走一步
直到后指针later走过链表尾结点时候跳出,跳出后first与尾结点距离为k-1
及first指向倒数第k个数,返回first即可
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if( head == null|| k == 0){
return null;
}
ListNode first = head;
ListNode larter = head;
for(int i = 0;i < k;i++){//later先走k步
if(larter== null){
return null;
}
larter = larter.next;
}
while(larter != null){
first = first.next;
larter=larter.next;
}
return first;
}
}