練習26 複雜鍊錶拷貝

2021-07-24 00:22:46 字數 2003 閱讀 3139

題目:請實現函式complexlistnode* clone(complextlistnode* phead),複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個pnext指標指向下乙個結點外,還有乙個psibling指向鍊錶的任意結點或者null。

結點的c++定義如下:

template

struct complexlistnode

;

如圖 實箭頭表示pnext   虛箭頭表示psibling

(問題 主要是要解決psibling)

方案一:1、根據pnext先複製乙個a' ->b'->c'->d'->e'新鍊錶

2、 設定新鍊錶的每個結點的psibling 

每次都從原鍊錶的頭開始向後掃瞄 從對應點開始 找到pslibing後記下次數 再在新鍊錶根據此數找到新鍊錶的pslibling

比如b->e 則設定乙個count從頭a開始掃,找出b 和 e之間的間隔結點數3 根據這個count

設定b'的psibling

方案一缺點:

1、每個結點pslibling的解決都是從頭找 時間複雜度為o(n^2) 有點大

方案二:(優化方案一 ,解決pslibling時間複雜度大的問題 )

1、 設定乙個索引(雜湊表) 將新錶和舊表的 每個結點的位址對應起來 這樣就能在o(1)的時間複雜度根據舊表的結點指標 找到新錶結點指標 所以總時間複雜度為o(n)

2、 方案二多用了一張表 ,空間複雜度為o(n) 相當於 用空間換時間 將時間複雜度從o(n^2)降到o(n)

方案三:(相對最優的  優化方案二 不用輔助空間 實現時間複雜度o(n)):

1、 先複製每個結點 不過把新結點 鏈結到原鍊錶對應 結點的後面

如: a->a'->b->b'->c->c'->d->d'->e->e'

2、這個新舊一體鏈有乙個特點 那就是 【新結點的pslibling 是 對應舊結點的pnext】

如 a->c  則 a'->c'   c'是c的pnext

3、 設定完後 奇偶節點拆鏈 分開新舊鍊錶

方案三**:

#pragma once

// 複雜鍊錶的 拷貝 (複雜鍊錶:鍊錶中還有乙個指標psibling指向別的節點) 

template

struct complexlistnode

;/* 建立每個新節點pcloned 分別鏈結到對應的 原節點 pnode後面 */

template

void clonenode(complexlistnode* phead)

/* 設定複製出來的節點 的 pslibling值*/

template

void connectsiblingnodes(complexlistnode* phead)

/* 拆分合併的鍊錶 (從1開始)奇數字置上組成原鍊錶 偶數字置上是複製出來的新鍊錶*/

template

complexlistnode* reconnectnodes(complexlistnode* phead)

// 複製複雜鍊錶函式

template

complexlistnode* clone(complexlistnode* phead)

--------------

#define _crt_secure_no_warnings 1

#include

#include "complexlistnode.hpp"

using namespace std;

void testcomplexlistnode()

int main()

// 本題出自【劍指offer】   面試題26 複雜鍊錶的複製

本文出自 「城市獵人」 部落格,請務必保留此出處

複雜鍊錶的拷貝

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 coding utf 8 class randomlistnode def in...

26 複雜鍊錶的複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 注 以下解析來自程式設計師面試題精選100題 49 複雜鍊錶的複製 演算法 精簡。第一步,為原始鍊錶的每個節點n建立對應的節點n 並把n 插入到n的後面 第二步,設定複製出來的節點的si...

26 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的 head。建立 random 鏈結 28 cur phead 29while cur null 34 cur clone next 35 3637 拆分 38 cur ...