連結串列面試題(五)---尋找連結串列的倒數第k個結點O(N)

gogogo_sky發表於2017-05-17

一、結構體定義:

typedef struct ListNode//定義結點
{
    DataType data;
    struct ListNode* next;
}ListNode,*PListNode;

typedef struct  PList//定義一個成員是指向結點的指標的結構體
{
    PListNode PHead;
}PList,*PList;

二、函式實現
思路:定義兩個指標a,b,一開始都指向連結串列的第一個結點,然後讓a指標以每次走一個結點的走法,先走k-1步,此時b指標仍然在第一個結點處,這時這兩個指標之間相差k-1個結點,然後讓兩個指標都以每次走一步的走法同時向前走,直到a指標走到尾部,此時b指標所指向的結點,就是連結串列倒數第k個結點;(個人覺得就是拿了一個k釐米的尺子,從連結串列的尾部丈量k距離的結點)

PListNode FindKNode(PList PList,int k)
{
    PListNode front=NULL;
    PListNode back=NULL;
    PListNode del=NULL;
    int i=0;
    assert(PList);
    front=PList->PHead;
    back=PList->PHead;
    if (PList->PHead==NULL||k<=0)//如果是空連結串列或者k<=0
    {
        return NULL;
    }
    else     //如果不是空連結串列,k>0
    {
        for(i=1;i<k;i++)   //front先走到k-1步
        {
            if (front)
            {
                front=front->next;
            }
            else//當k的值大於結點個數
            {
                return NULL;
            }
        }
        while (front->next)
        {
            front=front->next;
            back=back->next;
        }
        return back;
    }
}

相關文章