剑指offer: 如何求链表的倒数k个数呢? 不动手敲敲你永远不会发现自己是真的不懂

39 篇文章 2 订阅

题目:

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

解题思路我写在代码注释中了,我的天,看了n遍书上代码的我,居然敲不出来,太难啦!

重复三遍:我是傻子,我是傻子,我是傻子。。。。。呜呜,以示惩戒! 绝对不删

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
//首先进行异常输入的判断:
    // 1)链表为空
    // 2)k <= 0 | k > length
// 因为是倒数第k个,如果刚好能知道第k+1个的指针就完美了,可是从头找又太费劲, 为啥不用两个指针呢?
// 期望是第一个指针指向末端的时候,第二个指针指向倒数第k个
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(pListHead == nullptr || k <= 0) return nullptr;
       unsigned int len = 0;
        ListNode* pNode = pListHead;
        while(pNode!=nullptr) {
            len++;
            pNode = pNode->next;
        }
        if(len < k) return nullptr;
        ListNode* pNodek = pListHead;
        pNode = pListHead;
        unsigned int time = 0;
        while(pNode->next!=nullptr) {
            pNode=pNode->next;
            time++;
            if(time >= k)
                pNodek = pNodek->next;
        }
        return pNodek;
    }
};

我傻在哪里呢?就傻在if(time >= k) 这里,我一直认为肯定是time > k ,,,,,,,,,而且我还脑推了好几遍,话说我的脑子呢? 哦,没带

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值