# LinkedIn中如何復制隨機指針
## 引言
在計算機科學和編程面試中,"復制帶隨機指針的鏈表"是一個經典問題。這個問題不僅考察對鏈表結構的理解,還涉及哈希表、指針操作等核心概念。本文將詳細探討如何在LinkedIn(此處應為LeetCode,假設為筆誤)或其他編程平臺中解決這個問題,并提供多種解決方案的代碼實現和復雜度分析。
---
## 問題描述
給定一個鏈表,其中每個節點包含:
- `val`:節點的值
- `next`:指向下一個節點的指針
- `random`:隨機指向鏈表中任意節點或 `null` 的指針
要求**深度拷貝**這個鏈表,返回新鏈表的頭節點。新鏈表中的節點應為全新創建的對象,且 `next` 和 `random` 指針的指向關系與原鏈表一致。
### 示例
```python
class Node:
def __init__(self, val, next=None, random=None):
self.val = val
self.next = next
self.random = random
# 原始鏈表
original = Node(1)
original.next = Node(2)
original.random = original.next
original.next.random = original.next
# 拷貝后的鏈表應保持相同的結構
old_to_new = {None: None} # 處理random指向null的情況
current = head
while current:
old_to_new[current] = Node(current.val)
current = current.next
next
和 random
指針。
current = head
while current:
new_node = old_to_new[current]
new_node.next = old_to_new[current.next]
new_node.random = old_to_new[current.random]
current = current.next
old_to_new[head]
。
current = head
while current:
new_node = Node(current.val, current.next)
current.next = new_node
current = new_node.next
random
指針。
current = head
while current:
if current.random:
current.next.random = current.random.next
current = current.next.next
dummy = Node(0)
copy_current = dummy
current = head
while current:
copy_current.next = current.next
current.next = current.next.next
copy_current = copy_current.next
current = current.next
dummy.next
。def copyRandomList(head):
if not head:
return None
old_to_new = {}
# 第一次遍歷:創建節點映射
current = head
while current:
old_to_new[current] = Node(current.val)
current = current.next
# 第二次遍歷:設置指針
current = head
while current:
old_to_new[current].next = old_to_new.get(current.next)
old_to_new[current].random = old_to_new.get(current.random)
current = current.next
return old_to_new[head]
public Node copyRandomList(Node head) {
if (head == null) return null;
// 插入拷貝節點
Node current = head;
while (current != null) {
Node temp = new Node(current.val);
temp.next = current.next;
current.next = temp;
current = temp.next;
}
// 設置random指針
current = head;
while (current != null) {
if (current.random != null) {
current.next.random = current.random.next;
}
current = current.next.next;
}
// 分離鏈表
Node dummy = new Node(0);
Node copyCurrent = dummy;
current = head;
while (current != null) {
copyCurrent.next = current.next;
current.next = current.next.next;
copyCurrent = copyCurrent.next;
current = current.next;
}
return dummy.next;
}
復制帶隨機指針的鏈表問題需要巧妙處理指針關系。掌握哈希表和原地修改兩種方法,能幫助你在LinkedIn(LeetCode)等平臺的算法面試中游刃有余。建議根據實際場景選擇空間或時間優先的策略。 “`
注:假設標題中的”Linkedin”為”LeetCode”筆誤,若需調整內容方向請說明。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。