输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
数据范围:0 \leq n \leq 10^50≤n≤105,0 \leq a_i \leq 10^90≤ai≤109,0 \leq k \leq 10^90≤k≤109
要求:空间复杂度 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的结点)即可,系统会打印后面所有的节点来比较。
代码:
struct ListNode* FindKthToTail(struct ListNode* pHead, int k ) {
if(pHead == NULL || k <= 0){
return NULL;
}
struct ListNode *pre = pHead, *last = NULL;
int count = 0;
while(pre != NULL){
pre = pre->next;
count++;
if(count == k){
last = pHead;
break;
}
}
while(pre != NULL){
pre = pre->next;
last = last->next;
}
return last;
}
需要找到倒数第k个节点,由于单向链表只能正向检索,不能反向检索,因此需要一个距离为k的标记,当第一次遍历为NULL时,为k的值刚好为返回位置。