快慢指针法求链表中间节点与倒数第k个节点

查找单链表的中间节点,要求只能遍历一次链表

这个思路比较简单,利用快慢指针法即可,一个快指针【一次走两步】,一个慢指针【一次走一步】,只要快指针走到结束为止,慢指针恰好就在链表的中间!只不过快指针一次走两步,需要考虑链表元素个数为奇数个的问题,所以结束标志不只是快指针走到NULL位置,快指针的NEXT走到NULL也算是结束:

pNode FindMidNode(pList head)
{
    pNode fast = head;
    pNode slow = head;
    if (head == NULL || head->next == NULL)
        return head;

    while ((fast != NULL) && (fast->next != NULL))
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    return slow;
}

查找单链表的倒数第k个节点,要求只能遍历一次链表

这个与上面的查找中间节点的方式是一样的,也是使用两个指针只不过这次都是使用慢指针的方式,让一个指针先走k步,然后另一个指针才能开始走,直到先走的指针走到链表结尾,此时后走的指针刚好走到倒数第k个节点

//查找单链表的倒数第k个节点,要求只能遍历一次链表 
pNode FindLastKNode(pList *pplist, int k)
{
    pNode first = *pplist;
    pNode catch = *pplist;
    int num = 0;

    assert(pplist != NULL);
    if (*pplist == NULL)
        return NULL;
    while (first != NULL)
    {
        first = first->next;
        if (num++ >= k)
        {
            catch = catch->next;
        }
    }
    return catch;   
}

还是要注意特殊情况的处理!

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81206148
今日推荐