連結串列面試題(六)---刪除單連結串列倒數第k個結點

gogogo_sky發表於2017-05-17

一、結構體定義

typedef int DataType;

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

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

這裡寫圖片描述

二、函式實現
(1)刪除單連結串列倒數第k個結點—(k >1&& k<連結串列總結點數)—O(N)

void DelKNode1(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)//如果是空連結串列
    {
        return ;
    }
    else     //如果不是空連結串列,k>1 && K<連結串列總節點數
    {
        for(i=1;i<k;i++)   //front先走到k-1步,由於不知道連結串列的總節點數,所以要時刻注意連結串列訪問越界
        {
            front=front->next;
        }
        while (front->next)
        {
            front=front->next;
            back=back->next;
        }
        del=back->next;
        back->data=del->data;
        back->next=del->next;
        free(del);
    }
}

另一種寫法:
另一種寫法

(2)刪除單連結串列倒數第k個結點(K任意–有可能出現不合理情況)

//6.1【6的加強版】刪除單連結串列倒數第k個結點(K任意--有可能出現不合理情況)---O(N)
void DelKNode2(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 ;
    }
    if (k==1&&PList->PHead->next==NULL)//如果結點數為1,k==1
    {
        free(front);
        PList->PHead=NULL;
        return;
    }
    if (k==1)//如果不是空連結串列,結點數>1,k==1
    {
        while (front->next->next)
        {
            front=front->next;
        }
        free(front->next);
        front->next=NULL;
        return;
    }
    else     //如果不是空連結串列,k>1
    {
        for(i=1;i<k;i++)   //front先走到k-1步,由於不知道連結串列的總節點數,所以要時刻注意連結串列訪問越界
        {
            if (front->next)
            {
                front=front->next;
            }
            else//當k的值大於結點個數
            {
                return ;
            }
        }
        while (front->next)
        {
            front=front->next;
            back=back->next;
        }
        del=back->next;
        back->data=del->data;
        back->next=del->next;
        free(del);
    }
}

相關文章