當前位置:網站首頁>複制帶隨機指針的鏈錶<難度系數>
複制帶隨機指針的鏈錶<難度系數>
2022-05-15 02:10:57【華為雲】
題述:給你一個長度為 n 的鏈錶,每個節點包含一個額外增加的隨機指針 random ,該指針可以指向鏈錶中的任何節點或空節點。
構造這個鏈錶的深拷貝。 深拷貝應該正好由 n 個全新節點組成,其中每個新節點的值都設為其對應的原節點的值。
新節點的 next 指針和 random 指針也都應指向複制鏈錶中的新節點,並使原鏈錶和複制鏈錶中的這些指針能够錶示相同的鏈錶狀態。複制鏈錶中的指針都不應指向原鏈錶中的節點 。
例如,如果原鏈錶中有 X 和 Y 兩個節點,其中 X.random --> Y 。那麼在複制鏈錶中對應的兩個節點 x 和 y ,同樣有 x.random --> y 。返回複制鏈錶的頭節點。
用一個由 n 個節點組成的鏈錶來錶示輸入/輸出中的鏈錶。每個節點用一個 [val, random_index] 錶示:
val:一個錶示 Node.val 的整數。
random_index:隨機指針指向的節點索引(範圍從 0 到 n-1);如果不指向任何節點,則為 null 。
你的代碼只接受原鏈錶的頭節點 head 作為傳入參數。
示例1:
輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例2:
輸入:head = [[1,1],[2,1]]
輸出:[[1,1],[2,1]]
示例3:
輸入:head = [[3,null],[3,0],[3,null]]
輸出:[[3,null],[3,0],[3,null]]
示例4:
輸入:head = [ ]
輸出:[ ]
🧷 平臺:Visual studio 2017 && windows
核心思想:
思路一 (不實現):1,先複制原鏈錶的每個節點,再把新節點鏈接起來 (拷貝節點與原節點沒有建立關系);2,計算原鏈錶中的每個節點cur的random跟cur的相對距離;3,再去複制新鏈錶中找到當前節點相對距離的節點,賦值給random;找1個節點的random的時間複雜度是O(N),找所有節點的random的時間複雜度是O(N^2)
思路二 (優化思路一):1,在原鏈錶的每個節點的後面,鏈接插入一個拷貝節點 (建立相對關系,找random);2,置random;3,把拷貝節點解下來,鏈接到一起,同時恢複原鏈錶;時間複雜度是O(N)
#include<stdio.h>#include<stdlib.h>struct Node{ int val; struct Node* next; struct Node* random;};struct Node* copyRandomList(struct Node* head){ if(head == NULL) return NULL; //1.拷貝節點至每個原節點的後面 struct Node* cur = head; while(cur) { //先保存下一個節點的地址 struct Node* next = cur->next; //開避拷貝節點的空間 struct Node* copy = (struct Node*)malloc(sizeof(struct Node)); //要保證val是相同的 copy->val = cur->val; //修改原鏈錶的鏈接關系 cur->next = copy; copy->next = next; //迭代 cur = next; } //2.置random cur = head; while(cur) { //找拷貝節點 struct Node* copy = cur->next; //鏈接random,當cur的random為空時,需要特殊處理 if(cur->random) copy->random = cur->random->next; else copy->random = NULL; //迭代 cur = copy->next; } //3.把拷貝節點解下來,尾插至新鏈錶(使用帶哨兵比特的頭節點)。順手複原原鏈錶,雖然題意並沒有要求 struct Node *copyhead, *copytail; copyhead = copytail = (struct Node*)malloc(sizeof(struct Node)); cur = head; while(cur) { //找拷貝節點 struct Node* copy = cur->next; //保存原鏈錶的下一個節點的地址 struct Node* next = copy->next; //尾插 copytail->next = copy; copytail = copy; //恢複原鏈錶 cur->next = next; //迭代 cur = next; } //4.釋放空間 struct Node* temp = copyhead; copyhead = copyhead->next; free(temp); return copyhead;}int main(){ struct Node* n1 = (struct Node*)malloc(sizeof(struct Node)); n1->val = 3; struct Node* n2 = (struct Node*)malloc(sizeof(struct Node)); n2->val = 3; struct Node* n3 = (struct Node*)malloc(sizeof(struct Node)); n3->val = 3; n1->next = n2; n2->next = n3; n3->next = NULL; n1->random = n3; n2->random = n1; n3->random = NULL; copyRandomList(n1); return 0;}
版權聲明
本文為[華為雲]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/135/202205142058343961.html
邊欄推薦
猜你喜歡
隨機推薦
- 聊聊找工作
- 是能力更是文化,談談IT系統的安全發布
- tensorflow學習筆記(五)
- vitest支持cjs的workaround(TypeScript產物commonjs場景)
- 並發編程系列之Lock鎖可重入性與公平性
- 淺談 Fiori Fundamentals 和 SAP UI5 Web Components 的關系
- RAM/FIFO學習回顧
- 最新版2022年任我行管家婆工貿版ERP M7 V22.0進銷存財務生產管理軟件網絡版——雲上的集團化制造管理系統
- 【機器學習05】LASSO回歸與ElasticNet(彈性網)
- Idea快捷鍵
- 關於創建模態窗口和非模態窗口的研究
- An End-to-End Steel Surface Defect Detection Approach via Fusing Multiple Hierarchical Features-閱讀筆記
- 【性能測試】第五篇 | Jmeter環境安裝
- Matplotlib使用指南,100個案例從入門到進階!(附源代碼)
- Dots + interval stats and geoms
- SIGIR2022 | 基於用戶價格偏好及興趣偏好的會話推薦
- Cloudreve自建雲盤實站:容量和速度自己來决定
- 利用騰訊雲函數搭建免費代理池
- Redis的安裝及基本數據類型
- js輪播圖效果,透明度漸變實現
- 【棧+深度優先搜索】括號問題大匯總
- 筆記 第1章 流與文件(6) 文件隨機比特置讀取與Zip文件讀取
- 你的數據庫真的穿“防彈衣”了嗎
- 實驗四 進程同步與通信
- LeetCode騰訊精選練習50題-557.反轉字符串中的單詞III
- 軟考系統集成項目管理工程師全真模擬題(含答案、解析)
- 這款阿裏騰訊人都在用的API管理神器,解决你發愁的文檔問題
- 微服務最强理論基礎,堪稱絕妙心法
- OCTO作為美團的高性能服務通信框架,究竟能不能稱得上是殺手鐧呢?
- 沉浸式面試:MySQL連環炮,你能抗到第幾個?
- 阿裏四面一問:說說之前公司系統都用過的哪些限流模式?
- 速達軟件、金蝶軟件、用友軟件、管家婆軟件、鼎捷軟件等ERP軟件與進銷存軟件的區別
- P1439 【模板】最長公共子序列
- MySQL數據庫(8):數據類型-小數
- 38歲獨居男去世。
- 【FreeRtos任務恢複與掛起】
- UDS-如何在CAPL中實現診斷服務的請求和響應
- UDS-如何在CAPL中實現讀取DTC和它的狀態
- 智能複制多個文件夾裏全部文件到指定比特置
- 剪輯視頻,在視頻某時間段添加srt字幕