欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

復(fù)雜鏈表的復(fù)制——26-創(chuàng)新互聯(lián)

實(shí)現(xiàn)函數(shù)ComplexListNode* Clone(ComplexListNode* pHead),復(fù)制一個(gè)復(fù)雜鏈表。在復(fù)雜鏈表中,每個(gè)結(jié)點(diǎn)除了有一個(gè)m_pNext的指針指向下一個(gè)結(jié)點(diǎn)外,還有一個(gè)m_pSibling的指針指向鏈表中任意結(jié)點(diǎn)或者NULL。

成都創(chuàng)新互聯(lián)專注于涼州企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),購(gòu)物商城網(wǎng)站建設(shè)。涼州網(wǎng)站建設(shè)公司,為涼州等地區(qū)提供建站服務(wù)。全流程按需求定制制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

如下如所示的一個(gè)復(fù)雜鏈表,沒有畫出_sib指針的結(jié)點(diǎn)表示_sib指向NULL:

復(fù)雜鏈表的復(fù)制——26   對(duì)于復(fù)雜鏈表的復(fù)制,首先可以想到的是先遍歷一遍鏈表復(fù)制出各個(gè)結(jié)點(diǎn)并設(shè)置好_next指針,復(fù)制好單向的鏈表之后,對(duì)于_sib的隨機(jī)指針則需要每一次都從頭遍歷找出距當(dāng)前結(jié)點(diǎn)多遠(yuǎn)的結(jié)點(diǎn)才是應(yīng)該指向的隨機(jī)結(jié)點(diǎn),雖然可行,但不難發(fā)現(xiàn)這樣尋找隨機(jī)結(jié)點(diǎn)的時(shí)間復(fù)雜度是O(N*N);

  首先,有一種方法,仍然是先遍歷鏈表創(chuàng)建出相應(yīng)的結(jié)點(diǎn)并設(shè)置好每一個(gè)的_next指針,之后用一個(gè)哈希桶來(lái)保存每一個(gè)原鏈表結(jié)點(diǎn)的地址和新創(chuàng)建出結(jié)點(diǎn)的地址信息,也就是在每一個(gè)原鏈表結(jié)點(diǎn)地址的下面鏈上新創(chuàng)建出對(duì)應(yīng)的鏈表結(jié)點(diǎn)的地址,這樣的話一次就能定位新復(fù)制出鏈表中每一個(gè)結(jié)點(diǎn)的_sib應(yīng)該指向哪一個(gè)對(duì)應(yīng)的結(jié)點(diǎn)了;雖然時(shí)間復(fù)雜度降為了O(N),但這是一種以空間換時(shí)間的方法;

  另外的一種方法,是在遍歷到原鏈表的一個(gè)結(jié)點(diǎn)的時(shí)候,就新創(chuàng)建出一個(gè)結(jié)點(diǎn)插入當(dāng)前結(jié)點(diǎn)的后面,完成之后原鏈表就變成了兩個(gè)連續(xù)重復(fù)的結(jié)點(diǎn)的雙倍長(zhǎng)度的鏈表,這樣的話,原來(lái)鏈表中結(jié)點(diǎn)的_sib后面的重復(fù)的結(jié)點(diǎn),也就會(huì)是新創(chuàng)建鏈表對(duì)應(yīng)結(jié)點(diǎn)的_sib的指向,之后再?gòu)念^訪問(wèn)鏈表,將原鏈表中每個(gè)結(jié)點(diǎn)對(duì)應(yīng)的_sib指針后面的結(jié)點(diǎn)賦值給當(dāng)前結(jié)點(diǎn)后面新創(chuàng)建結(jié)點(diǎn)的_sib,這樣也就完成了新建鏈表的_sib指向,之后再將兩個(gè)鏈表拆開就可以了;

程序設(shè)計(jì)如下:

#include <iostream>
#include <assert.h>
using namespace std;

int list_num = 0;

struct ComplexListNode//復(fù)雜鏈表結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)
{
    int _val;
    ComplexListNode* _next;
    ComplexListNode* _sib;

    ComplexListNode(int val)//構(gòu)造函數(shù)
        :_val(val)
         ,_next(NULL)
         ,_sib(NULL)
    {}  
};

ComplexListNode* Buy_Node(int val)//構(gòu)建復(fù)雜鏈表結(jié)點(diǎn)
{
    ComplexListNode* node = new ComplexListNode(val);
    return node;
}

//插入結(jié)點(diǎn)
void Push_Node(ComplexListNode** phead, int val)
{
    if((*phead) == NULL)
        (*phead) = Buy_Node(val);
    else
    {   
        ComplexListNode* tmp = (*phead);
        while(tmp->_next != NULL)
            tmp = tmp->_next;
        tmp->_next = Buy_Node(val);
    }

    ++list_num;
}

//設(shè)置自由結(jié)點(diǎn)的指向
void SetSibPointer(ComplexListNode* head, int* positions)
{
    assert(head && positions);

    ComplexListNode* tmp = head;
    ComplexListNode *p[list_num];
    for(size_t i = 0; i < list_num; ++i)
    {
        p[i] = tmp;
        tmp = tmp->_next;
    }

    tmp = head;
    for(size_t i = 0; i < list_num; ++i)
    {
        if(positions[i] != 0)
            tmp->_sib = p[positions[i]];

        tmp = tmp->_next;
    }
}

//銷毀鏈表
void DestoryList(ComplexListNode* head)
{
    if(head != NULL)
    {
        ComplexListNode* tmp = head;
        while(head != NULL)
        {
            head = head->_next;
            delete tmp;
            tmp = NULL;
            tmp = head;
        }
    }
}

//打印鏈表
void PrintList(ComplexListNode* head)
{
    if(head != NULL)
    {
        ComplexListNode *tmp = head;
        while(tmp != NULL)
        {
            cout<<tmp->_val<<"->";
            tmp = tmp->_next;
        }
        cout<<"NULL"<<endl;

        tmp = head;
        while(tmp != NULL)
        {
            cout<<tmp->_val<<" sibling is ->";
            if(tmp->_sib != NULL)
                cout<<tmp->_sib->_val<<endl;
            else
                cout<<"NULL"<<endl;

            tmp = tmp->_next;
        }
    }
}

//復(fù)制復(fù)雜鏈表
ComplexListNode* Clone(ComplexListNode* head)
{
    if(head != NULL)
    {
        ComplexListNode *tmp = head;
        ComplexListNode *newnode = NULL;

        //復(fù)制每個(gè)結(jié)點(diǎn)并插入當(dāng)前結(jié)點(diǎn)的后面
        while(tmp != NULL)
        {
            newnode = Buy_Node(tmp->_val);
            newnode->_next = tmp->_next;
            tmp->_next = newnode;
            tmp = newnode->_next;
        }

        //設(shè)置新創(chuàng)建鏈表結(jié)點(diǎn)的sib指針的指向
        tmp = head;
        newnode = tmp->_next;
        while(tmp != NULL)
        {
            if(tmp->_sib != NULL)
                newnode->_sib = tmp->_sib->_next;
            tmp = newnode->_next;
            if(tmp != NULL)
                newnode = tmp->_next;
        }
        //拆分兩個(gè)鏈表
        tmp = head;
        ComplexListNode* NewHead = tmp->_next;
        newnode = tmp->_next;
        while(tmp != NULL)
        {
            tmp->_next = newnode->_next;
            tmp = tmp->_next;
            if(tmp != NULL)
            {
                newnode->_next = tmp->_next;
                newnode = newnode->_next;
            }
        }

        return NewHead;
    }
}

int main()
{
    ComplexListNode* head = NULL;
    Push_Node(&head, 7);
    Push_Node(&head, 5);
    Push_Node(&head, 8);
    Push_Node(&head, 2);
    Push_Node(&head, 6);
    Push_Node(&head, 9);
    Push_Node(&head, 3);

    int positions[7] = {2,5,0,4,0,0,4};
    SetSibPointer(head, positions);
    cout<<"Complex List: ";
    PrintList(head);
     ComplexListNode* NewComplexListHead = Clone(head);
    cout<<"New Complex List: ";
    PrintList(NewComplexListHead);
    cout<<"Complex List: ";
    PrintList(head);

    DestoryList(head);
    DestoryList(NewComplexListHead);
    return 0;
}

運(yùn)行程序:

復(fù)雜鏈表的復(fù)制——26

《完》

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站名稱:復(fù)雜鏈表的復(fù)制——26-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://www.chinadenli.net/article30/dhsdpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)做網(wǎng)站網(wǎng)站設(shè)計(jì)公司網(wǎng)站內(nèi)鏈網(wǎng)站改版營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)