题目:
输入一个链表,输出该链表中倒数第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 ,,,,,,,,,而且我还脑推了好几遍,话说我的脑子呢? 哦,没带