# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。