剑指Offer——(14)链表中倒数第k个结点

本文介绍了一种高效查找链表中倒数第K个节点的方法,通过使用双指针技巧,在单次遍历中实现了目标节点的定位,并讨论了多种边界情况。

题目描述:

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

实现如下:

//在线测试用例依旧是无头链表→_→
//最后一个节点定义为倒数第一个节点
//1->2->3->4->5
//p     s
//      p     s
//eg.寻找倒数第3个节点 k-1=2
//要想一次遍历找到倒数第k个节点,关键在于最后一个节点与倒数第k个节点之间相差k-1个节点
//所以要保证两个指针之间一直保持k-1个节点差
//健壮性:
//1.传入空指针
//2.k为无符号正数,k<1
//3.不存在倒数第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) 
    {
        if (pListHead == NULL || k < 1) return NULL;//传入空指针、k无效

        ListNode *p = pListHead;
        ListNode *s = pListHead;
        int num = 0;//记录s指针移动的次数
        while (s->next != NULL)//直到遍历完此链表
        {
            s = s->next;
            ++num;
            //当s移动次数大于等于k时,才能让p开始移动,此时两指针保持k-1距离
            if (num >= k) p = p->next;
        }
        //如果s移动次数都小于两者必须的间距,说明不存在倒数第k个节点
        if (num < k - 1) return NULL;
        return p;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值