题目描述
题目链接:链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)
题目分析
我们可以利用快慢指针来解决问题:
思路一:
先让fast走k步,这时候fast和slow之间的距离就是k,然后让fast和slow同时同步往后走,当fast走到NULL的时候,slow就指向了倒数第k个结点了
while(k--)就是走k步
思路二:
先让fast走k-1步,这时候fas->next和slow之间的距离就是k,然后让fast和slow同时同步往后走,当fast->next走到NULL的时候,slow就指向了倒数第k个结点了
while(--k)就是走k-1步,由于fast走到NULL就没有fast->next了,这里我们需要加一个判断:
fast或者fast->next为NULL就返回NULL
代码示例
代码一
根据思路一,我们可以写出代码一:
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * * @param pListHead ListNode类 * @param k int整型 * @return ListNode类 */ struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) { struct ListNode* fast = pListHead, *slow = pListHead; while(k--) { if(fast==NULL) { return NULL; } fast=fast->next; } while(fast) { slow=slow->next; fast=fast->next; } return slow; }
结果就可以通过咯
代码二
根据思路二,我们可以写出代码二:
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * * @param pListHead ListNode类 * @param k int整型 * @return ListNode类 */ struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) { struct ListNode* fast = pListHead, *slow = pListHead; while(--k) { if(fast==NULL||fast->next==NULL) { return NULL; } fast=fast->next; } while(fast->next) { slow=slow->next; fast=fast->next; } return slow; }
结果当然就是通过