题目连接:链表中倒数最后k个结点_牛客题霸_牛客网 (nowcoder.com)
题目描述:
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
数据范围:0≤n≤10^5,0≤ai≤10^9,0≤k≤10^9
要求:空间复杂度 O(n),时间复杂度 O(n)
进阶:空间复杂度 O(1),时间复杂度 O(n)
例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:
其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。
题目解答:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/*
*BM8 链表中倒数最后k个结点
描述
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:
其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。
*/
/**************************code*****************************************/
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* FindKthToTail(struct ListNode* pHead, int k ) {
// write code here
//双指针法
struct ListNode *pfast, *pslow;
pfast = pHead, pslow = pHead;
for(int i = 0; i < k; i++){ //找到距slow K个位置的fast
if(!pfast) //如果fast不存在,表示已经找到末尾,返回NULL
return NULL;
pfast = pfast->next;
}
while(pfast){ //如果fast一直存在,则快慢指针一起向后移动,
pfast = pfast->next; //直到fast找到末尾,退出
pslow = pslow->next;
}
return pslow;
}
/**************************end******************************************/
int main ()
{
struct ListNode LN15={5,NULL};
struct ListNode LN14={4,&LN15};
struct ListNode LN13={3,&LN14};
struct ListNode LN12={2,&LN13};
struct ListNode LN1 ={1,&LN12};
struct ListNode LN2 ={1,NULL};
struct ListNode* ret = FindKthToTail(&LN1, 5);
while(ret){
printf("-*-- %d \r\n", ret->val);
ret = ret->next;
}
return 0;
}