链表中倒数第K个节点

这里只说只遍历一次找到该节点的办法。

我们可以定义2个指针指向表头,然后让第一个指针向前k-1步,第二个指针不动。等第一个指针到达该位置后,2个指针同时开始前进,当第一个指针到达链表尾部的时候第二个指针指向的节点就是想要找的节点。

类似的我们也可以用这种思想来找链表的中间节点。定义2个指针,一个指针走一次走1步,另一个一次走2步,这样当那个走的快的指针走到链表尾部的时候,慢的指针就指向链表中间了。

struct ListNode
{
    int value;
    ListNode* pNext;
};

ListNode* FindKthToTail(ListNode* pHead, unsigned int k)
{
    if( pHead == NULL || k == 0 )
        return NULL;

    ListNode *pAhead = pHead;
    ListNode* pBehind = pHead;

    for( unsigned int i = 0; i < k-1; ++i)
    {
        //处理K比链表长的情况
        if(pAhead->pNext !=NULL ) 
            pAhead = pAhead->pNext;
        else
            return NULL;
    }

    while(pAhead->pNext !=NULL)
    {
        pAhead =pAhead->pNext;
        pBehind = pBehind->pNext;
    }
    return pBehind;
}

这里特别要注意的点是注意处理K=0时的特殊情况,和K大于链表长度时的特殊情况。

posted @ 2013-03-03 15:19  没离开过  阅读(77)  评论(0)    收藏  举报