複雜連結串列的複製
題目:
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標random指向一個隨機節點),請對此連結串列進行深拷貝,並返回拷貝後的頭結點。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
思路1-三步法:
- 這道題主要是考察連結串列指標的操作,在理解題意的前提下分為三步
- 首先要拷貝簡單連結串列的每個結點至原結點的下一個位置(拷貝值)
- 其次要拷貝其中的random指標(拷貝結點的random指標指向原結點random指標的下一個結點),因為就相當於指向了拷貝後的結點
- 最後將前兩步生成的長連結串列拆分出拷貝的部分(即按奇偶分割),因為拷貝random指標時依賴第二步的關聯方式,如果直接開闢一個新連結串列,只能做到淺拷貝,是複製不了其中的random指標的
此處貼個圖更形象:
程式碼1:
public class Solution {
public RandomListNode Clone(RandomListNode pHead) {
if(pHead == null) {
return null;
}
RandomListNode currentNode = pHead;
//1、複製每個結點,如複製結點A得到A1,將結點A1插到結點A後面;
while(currentNode != null){
RandomListNode cloneNode = new RandomListNode(currentNode.label);
RandomListNode nextNode = currentNode.next;
currentNode.next = cloneNode;
cloneNode.next = nextNode;
currentNode = nextNode;
}
currentNode = pHead;
//2、重新遍歷連結串列,複製老結點的隨機指標給新結點,如A1.random = A.random.next;
while(currentNode != null) {
currentNode.next.random = currentNode.random==null?null:currentNode.random.next;
currentNode = currentNode.next.next;
}
//3、拆分連結串列,將連結串列拆分為原連結串列和複製後的連結串列
currentNode = pHead;
RandomListNode pCloneHead = pHead.next;
while(currentNode != null) {
RandomListNode cloneNode = currentNode.next;
currentNode.next = cloneNode.next;
cloneNode.next = cloneNode.next==null?null:cloneNode.next.next;
currentNode = currentNode.next;
}
return pCloneHead;
}
}
思路2-Hash法:
- 直接用map來記錄指標間的聯絡,可以直接找到random指標
程式碼2:
import java.util.HashMap;
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
HashMap<RandomListNode, RandomListNode> map = new HashMap<>();
RandomListNode cur = pHead;
while (cur != null) {
map.put(cur, new RandomListNode(cur.label));
cur = cur.next;
}
cur = pHead;
while (cur != null) {
map.get(cur).next = map.get(cur.next);
cur = cur.next;
}
RandomListNode resHead = map.get(pHead);
cur = pHead;
while (cur != null) {
map.get(cur).random = map.get(cur.random);
cur = cur.next;
}
return resHead;
}
}
相關文章
- JZ-025-複雜連結串列的複製
- 面試題35:複雜連結串列的複製面試題
- 劍指 Offer 35. 複雜連結串列的複製
- 複雜連結串列的復刻
- 隨機連結串列的複製隨機
- [連結串列]leetcode138-複製帶隨即指標的連結串列LeetCode指標
- LeetCode 複製帶隨機指標的連結串列LeetCode隨機指標
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標
- Leetcode 234. 迴文連結串列 快慢指標+連結串列逆序實現O(n)時間複雜度且O(1)空間複雜度LeetCode指標時間複雜度
- LeetCode-138-複製帶隨機指標的連結串列LeetCode隨機指標
- js實現複製連結JS
- 「複製帶隨機指標的連結串列」的一個很巧妙解法隨機指標
- Selenium 獲取複製後的連結
- LeetCode 138:複製帶隨機指標的連結串列 Copy List with Random PointerLeetCode隨機指標random
- JZ-056-刪除連結串列中重複的結點
- ZeroClipboard 多個複製按鈕,多個複製連結 實現方式
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- L2-002 連結串列去重(複習)
- 從未排序的連結串列中刪除重複項排序
- 一些Q複製實踐的連結
- 牛客(刪除連結串列中重複節點)
- 淺複製和深複製的概念與值複製和指標複製(引用複製)有關 淺複製 “指標複製 深複製 值複製指標
- 單連結串列複製你已經會了,如果我們再加個指標...指標
- Day 7.5 資料型別總結 + 複製 淺複製 深複製資料型別
- JZ76 刪除連結串列中重複的節點
- DDD之理解複雜度、尊重複雜度、掌控複雜度複雜度
- 力扣-83. 刪除排序連結串列中的重複元素力扣排序
- 83. 刪除排序連結串列中的重複元素(JavaScript版)排序JavaScript
- leetcode-82:刪除排序連結串列中重複的元素-iiLeetCode排序
- 劍指offer-----刪除連結串列中的重複節點
- js複製連結並且選中文字JS
- 重學資料結構和演算法(一)之複雜度、陣列、連結串列、棧、佇列、圖資料結構演算法複雜度陣列佇列
- Java引用複製、淺複製、深複製Java
- 複雜度分析的套路及常見的複雜度複雜度
- 0928面試小節:刪除有序連結串列中的重複元素面試
- JS物件複製:深複製和淺複製JS物件
- 複製和引用複製
- go的深複製跟淺複製Go