簡體   English   中英

隨機合並兩個鏈表

[英]Randomly merging two linked lists

首先,我要尋找並嘗試了幾種不同的解決方案,但都沒有碰到運氣。 我從事此工作已經太久了,因此我們將不勝感激。

任務是將代表一副紙牌的鏈表改組。 我得到了所有方法聲明,並被告知只能使用遞歸。 我已經以一切可能的方式嘗試了這一點,但沒有任何運氣。

基本上,我們被告知要使用的策略是將鏈接列表分為2個,對兩個列表進行混洗(通過遞歸調用shuffle方法),然后將經過混洗的列表合並在一起。

您可能需要了解的一些知識:

  • LLN =鏈表節點
  • len =“此”列表的長度
  • b =與“ this”合並的列表
  • blen =“ b”列表的長度

這段代碼返回一個空列表,我看不出原因(很明顯)。 LLN-> shuffle()應該返回隨機列表的頭部。 現在,它正在返回一個空列表。

LLN * LLN::merge(int len, LLN *b, int blen) {
    //cout << "len: " << len << ", blen: " << blen << endl;

    if (len == 0) return b;
    if (blen == 0) return this;

    int r = rand() % (len + blen) + 1; // between 1 and (len + blen)

    if (r <= len) {
        if (next)
            next = next->merge(len - 1, b, blen);
        else
            next = b;

        return this;
    } else {
        if (b->getnext())
            b->setnext(b->getnext()->merge(blen - 1, this, len));
        else
            b->setnext(this);

        return b;
    }
}

LLN *LLN::shuffle(int len) {
    if (len == 1)
        return this;

    LLN *tmp = split();

    int thisLength = (len + 1) / 2; // for an odd numbered length, "this" list is 1 node larger
    int tmpLength = len / 2;

    shuffle(thisLength);
    tmp = tmp->shuffle(tmpLength);

    return merge(thisLength, tmp, tmpLength);
}

這就是方法的調用方式。

void LL::shuffle() {
    if (head != NULL)
        head = head->shuffle(size);
}

LL(鏈接列表)對象使用標准的52卡(每個卡為節點)初始化。

如果您還有其他需要,請告訴我。

非常感謝!

shuffle(thisLength);
tmp = tmp->shuffle(tmpLength);

return merge(thisLength, tmp, tmpLength);

在這里shuffle(thisLength)的返回值可能不是 this ,所以我們應該這樣做

first = shuffle(thisLength);
tmp = tmp->shuffle(tmpLength);

return first->merge(thisLength, tmp, tmpLength);

在教授的幫助下,我能夠找出問題所在。 原來我的錯誤是我的split()方法的基本情況。 修復后,一切正常。 我還應用了查理的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM