牛客 —— 链表中倒数第k个结点(C语言,快慢指针,配图)

目录

1. 思路1:倒数第K个节点,就是整数第N-K+1的节点

2. 思路2:快慢指针


牛客 —— 链表中倒数第k个结点(C语言,快慢指针,配图)_第1张图片

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个节点

牛客 —— 链表中倒数第k个结点(C语言,快慢指针,配图)_第2张图片

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;
}

牛客 —— 链表中倒数第k个结点(C语言,快慢指针,配图)_第3张图片

你可能感兴趣的:(LeetCode,刷题总结,链表,数据结构,算法,c语言,leetcode)