T11-链表的倒数第k个节点

本文介绍了一种在不使用额外空间的情况下找到链表中倒数第K个节点的算法。通过双指针技巧,第一个指针先向前移动K步,然后两个指针同步移动,直到第一个指针到达链表尾部,此时第二个指针所指即为所需节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

输入一个链表,输出该链表中倒数第k个结点。

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M

解题思路

此题,开始就想到引入一个栈,对链表遍历,并且一次压入栈,之后再从栈中弹出k个节点,即为所求。但是这样虽然只遍历了一遍链表,但是引入栈带来了额外的空间消耗,并不是最佳算法。

那么,换个思路,求倒数第k个节点,但是链表只能从头至尾遍历。所以,如果我们能够知道链表的长度length,我们就可以直接从头向后遍历至第length-k+1个节点即可。
此方法,两个循环,每个循环时间复杂度都是o(n);

再进一步分析,能不能只遍历链表一次?
如果想只遍历一次,那么就需要遍历至指针指向第length-k+1个节点,但length不知,就需要考虑一种能替换length的方法。这里就想到,用一个指针1从头至尾遍历,也就相当于length,再来一个指针2在指针1遍历到第k个节点时,再跟着一起遍历即可。

源代码

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode* fir = NULL;
        ListNode* las = NULL;
        fir = pListHead;
        las = pListHead;
        //记录k值
        int a=k;
        //记录节点的个数
        int count=0;
        //fir指针先遍历,并且记录节点数;
        //当fir指针遍历至第k个节点时,las指针开始跟着进行遍历,
        //这样,当fir指针遍历完时,las所指的就是倒数第k个节点
        while(fir!=NULL){
            fir = fir -> next;
            count++;
            if(a<1){
                las = las->next;
            }
            a--;
        }
        if(count<k) return NULL;
        return las;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值