(劍指Offer)面試題26 複雜鍊錶的複製

2021-09-07 01:17:01 字數 2491 閱讀 9617

請實現函式complexlistnode* clone(complexlistnode* phead),複製乙個複雜鍊錶。

在複雜鍊錶中,每個結點除了有乙個pnext指標指向下乙個結點之外,還有乙個psibling指向鍊錶中的任意結點或者null。

結點的定義如下:

struct complexlistnode;

方法1:

複製原始鍊錶上的每乙個結點,並通過pnext連線起來;然後再設定每個結點的psibling指標。

假設原始鍊錶中某個結點n的psibling指標指向結點s,那麼就需要從頭到尾遍歷查詢結點s,如果從原始鍊錶的頭指標開始,經過m步之後達到結點s,那麼在複製鍊錶中的結點n'的psibling指標指向的結點也是距離複製鍊錶s步的結點。通過這種辦法就可以為複製鍊錶上的每個結點設定psibling指標。

時間複雜度:o(n^2)

方法2:

方法1是通過鍊錶查詢來得到psibling指標所指向的結點,實際上我們可以通過空間換取時間,將原始鍊錶和複製鍊錶的結點通過雜湊表對應起來,這樣查詢的時間就從o(n)變為o(1)。具體如下:

複製原始鍊錶上的每個結點n建立n',然後把這些建立出來的結點用pnext連線起來。同時把的配對資訊方法乙個雜湊表中;然後設定複製鍊錶中的每個結點的psibling指標,如果原始鍊錶中結點n的psibling指向結點s,那麼在複製鍊錶中,對應的n'應該指向s'。

時間複雜度:o(n)

方法3:

在不使用輔助空間的情況下實現o(n)的時間效率。

第一步:根據原始鍊錶的每個結點n建立對應的n',然後將n『通過pnext接到n的後面;

第二步:設定複製出來的結點的psibling。假設原始鍊錶上的n的psibling指向結點s,那麼其對應複製出來的n'是n->pnext指向的結點,同樣s'也是結點s->pnext指向的結點。

第三步:把長鍊錶拆分成兩個鍊錶,把奇數字置的結點用pnext連線起來的就是原始鍊錶,把偶數字置的結點通過pnext連線起來的就是複製鍊錶。

1、hash方法:

struct complexlistnode;

};typedef std::mapmap;

complexlistnode* clonenodes(complexlistnode* phead,map &hashnode)

return pnode->pnext;

}void setsiblings(complexlistnode* phead,complexlistnode* pcopy,map &hashnode)

}complexlistnode* complexlistcopy(complexlistnode* phead)

2、複製連線方法:

#include using namespace std;

struct complexlistnode;

};void clonenodes(complexlistnode* phead)

}void connectsiblingnodes(complexlistnode* phead)

pnode=pcloned->pnext;

}}complexlistnode* reconnectnodes(complexlistnode* phead)

while(pnode!=null)

return pclonedhead;

}complexlistnode* clone(complexlistnode* phead)

ac**:

/*

struct randomlistnode

};*/

class solution

return pcopy->next;

}void setrandomnode(randomlistnode* phead,randomlistnode* pcopy,map &hashnode)

}randomlistnode* clone(randomlistnode* phead)

};

/*

struct randomlistnode

};*/

class solution

void clonenodes(randomlistnode* phead)

}void clonerandom(randomlistnode* phead)

phead=pcloned->next;}}

randomlistnode* reconnectnodes(randomlistnode* phead)

while(pnode!=null)

return pclonedhead;

}};

劍指Offer 面試題26 複雜鍊錶的複製

複雜鍊錶的複製 請事先函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個m pnext指標 指向下乙個結點外,還有乙個m psibling指向鍊錶中的任意結點或者null。a b c d e 兄弟指向 a指向...

劍指offer 面試題26 複雜鍊錶的複製

以下圖為5個結點的複雜鍊錶,實線表示m pnext指標的指向,虛線表示m psibling指標的指向 解法一 分兩步1 遍歷一遍鍊錶,用m pnext指標將鍊錶連起來,o n 2 假設原始鍊錶中的某節點n的m psibling指向結點s,由於s的位置在鍊錶上有可能在n的前面也可能在n的後面,所以要定...

《劍指Offer》面試題26 複雜鍊錶的複製

劍指offer 面試題26 複雜鍊錶的複製 分解複雜問題 請實現乙個函式用於複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個m pnext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中的任意結點或者null。結點的c 定義如下 複雜鍊錶結點定義 struct complexlistn...