文章目錄
- 題目
- 題目決議
- 解題思維
- 1. 既然是深拷貝,就是把舊鏈表 val ,還有 next 和 random 指向的物件都要拷貝下來,只不過兩者物件的地址是不同的,
- 2.我們先把 原鏈表的 val 值,以及鏈表節點個數拷貝下來,并且將新鏈表 和 舊鏈表連接起來,
- 3. 將原鏈表中的random值也“拷貝”下來
- 4. 將 新舊鏈表分割開來
- 最后附上程式
題目

?
題目決議

首先題目要求我們賦值這么一個鏈表,新鏈表中 :val值完全一樣,next 和 random 雖然不一樣,但是指向鏈表中 節點的val值是一樣的,而且指向的該節點的位置和源節點位置 是一樣的,
簡單來說,就是 新鏈表 和 舊鏈表的地址 地址是不一樣的,架構上完全一樣,
?
解題思維
1. 既然是深拷貝,就是把舊鏈表 val ,還有 next 和 random 指向的物件都要拷貝下來,只不過兩者物件的地址是不同的,
2.我們先把 原鏈表的 val 值,以及鏈表節點個數拷貝下來,并且將新鏈表 和 舊鏈表連接起來,

3. 將原鏈表中的random值也“拷貝”下來
題目要求:新鏈表中:新節點的 next 指標和 random 指標也都應指向復制鏈表中的新節點,并使原鏈表和復制鏈表中的這些指標能夠表示相同的鏈表狀態,就像我們前面演示的一樣, 指向的節點也是“相同的”,
那么,也就是說新鏈表 random的指向 應該 與 舊鏈表的指向 “相同”,
在來我怎么將新鏈表的random指向 與 舊鏈表的 random 指向 “相同的節點”,
4. 將 新舊鏈表分割開來

?
最后附上程式
class Solution {
public Node copyRandomList(Node head) {
if(head == null){
return head;
}
for(Node node = head; node!=null;node =node.next.next){
Node newNode = new Node(node.val);
newNode.next = node.next;
node.next = newNode;
}
for(Node node = head; node!=null;node = node.next.next){
Node newNode = node.next;
newNode.random = (node.random != null) ? node.random.next:null;
}
Node newHead = head.next;
for(Node node = head;node!=null;node = node.next){
Node newNode = node.next;
node.next = node.next.next;
newNode.next = (newNode.next != null) ? newNode.next.next : null;
}
return newHead;
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/393912.html
標籤:java
上一篇:Servlet生命周期




