本题来自链表中倒数最后k个结点_牛客题霸_牛客网 (nowcoder.com)
题目:
描述
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
数据范围:50≤n≤105,90≤ai≤109,0≤k≤109
要求:空间复杂度 O(n),时间复杂度 O(n)
进阶:空间复杂度 O(1),时间复杂度 O(n)
例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:
其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。
示例1
输入:{1,2,3,4,5},2
返回值:{4,5}
说明:返回倒数第2个节点4,系统会打印后面所有的节点来比较。
示例2
输入:{2},8
返回值:{}
思路:
本题不排除为空链表的情况,因此要先拎出来判断一下,后面分析的时候看看能不能合并
这里,也是用两个指针的方法,其实一个指针也行不过可能会乱
一个指针cur指向靠前的指针,一个指针prev比cur相差k个节点,所以要让cur先走k步,又不知道有几个节点,如果还是遍历两遍的这种方式,就比较挫了
因此咱就遍历一遍,让cur先走k步的过程中,一旦在走的过程中cur为空了,说明k就大于链表的节点个数了,直接返回NULL就行,题里也说了给NULL就行
然后走到这一步了,说明cur已经走到了prev的k步之前,再遍历链表当cur到结尾,说明prev就是倒数k位了,弹出prev就可以了,很简单的题
上代码:
typedef struct ListNode node;
struct ListNode* FindKthToTail(struct ListNode* pHead, int k) {
// write code here
node* prev = pHead;
node* cur = pHead;
while (k)// 让当前指针先走k步,如果k步没走完cur就为空了,说明k太大了,超出范围了
{
if (!cur)//cur有效就是真,当cur为真,!cur就是假,if的条件不成立就不弹出了
return NULL;
cur = cur->next;
k--;
}
// 找尾
while (cur)
{
cur = cur->next;
prev = prev->next;
}
return prev;
}