目录
题目来源:
代码实现:
分析过程:
错误分析:
题目来源:
https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&&tqId=11167&rp=2&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking
题目描述:
![[ 链表OJ题 ] 输入一个链表,输出该链表中倒数第k个结点。_数据结构](https://file.cfanz.cn/uploads/png/2022/05/24/13/367H63646A.png)
代码实现:
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
struct ListNode* slow,* fast;
slow = fast = pListHead;
while(k--)
{
//k大于链表的长度
if(fast == NULL)
return NULL;
fast = fast->next;
}
while(fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}分析过程:
![[ 链表OJ题 ] 输入一个链表,输出该链表中倒数第k个结点。_错误分析_02](https://file.cfanz.cn/uploads/png/2022/05/24/13/UY9X9386X1.png)
让fast先走K步,然后一起走,当fast为空时,slow所指向的元素就是该链表的倒数第k个元素。
错误分析:
![[ 链表OJ题 ] 输入一个链表,输出该链表中倒数第k个结点。_C语言_03](https://file.cfanz.cn/uploads/png/2022/05/24/13/628aFE52S0.png)
我们按照分析的错误发现,程序并没有跑过去,并报有段错误,段错误一般就是空指针,或者数组越界等情况,此时我们应该根据测试用例一个一个试,具体问题具体分析。
![[ 链表OJ题 ] 输入一个链表,输出该链表中倒数第k个结点。_C语言_04](https://file.cfanz.cn/uploads/png/2022/05/24/13/O6OS3IZ3fb.png)
第一组成功,我们再来试试第二组
![[ 链表OJ题 ] 输入一个链表,输出该链表中倒数第k个结点。_数据结构_05](https://file.cfanz.cn/uploads/png/2022/05/24/13/2LT63H0f29.png)
我们发现当链表为空时,我们要查找倒数100个元素时,应当返回的是NULL,但是我们先让fast先走k步中,fast = fast->next这条语句肯定发生了空指针异常,因此我们只需在fast前增加判断,当fast为NULL时,说明我们要查找的元素一定为NULL。
![[ 链表OJ题 ] 输入一个链表,输出该链表中倒数第k个结点。_错误分析_06](https://file.cfanz.cn/uploads/png/2022/05/24/13/J19Y56eRH1.png)
![[ 链表OJ题 ] 输入一个链表,输出该链表中倒数第k个结点。_错误分析_07](https://file.cfanz.cn/uploads/png/2022/05/24/13/51Ee0Jec2E.png)
![[ 链表OJ题 ] 输入一个链表,输出该链表中倒数第k个结点。_C语言_08](https://file.cfanz.cn/uploads/png/2022/05/24/13/A8cRb0ab46.png)
(本题完)










