牛客 —— 链表中倒数第k个结点(C语言,快慢指针,配图)
目录
1. 思路1:倒数第K个节点,就是整数第N-K+1的节点
2. 思路2:快慢指针
1. 思路1:倒数第K个节点,就是整数第N-K+1的节点
链表中,一共有N个节点,如果我们想要得出倒数第K个节点,我们就可以简单理解为正数第N-K+1的节点。但因为需要多重判断,这里更推荐第二种方法,即快慢指针。
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
int n =0;
struct ListNode* cur = pListHead;
//判断是否为链表是否为空
if(pListHead == NULL)
{
return NULL;
}
while(cur)
{
n++;
cur = cur->next;
}
//检查k是否超出界限
if(k > n)
{
return NULL;
}
n = n-k;
while(n--)
{
pListHead = pListHead->next;
}
return pListHead;
}
2. 思路2:快慢指针
这里我们定义快指针fast,慢指针slow,让快指针先走k步,然后快慢指针同时走,当快指针等于NULL时,slow指针指向的节点就是倒数第K个节点
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
// write code here
struct ListNode* fast = pListHead;
struct ListNode* slow = pListHead;
while(k--)
{
if(fast == NULL)
{
return NULL;
}
fast = fast->next;
}
while(fast)
{
fast = fast->next;
slow = slow->next;
}
return slow;
}