在做力扣热题100里的“随机链表的复制”时,很多人第一眼觉得这就是普通链表深拷贝:遍历一遍 next,把节点 new 出来不就行了?真正动手才发现,random 指针才是这题的灵魂。它可能指向前面已经走过的节点,也可能指向后面还没创建的节点,如果只顺着 next 顺序复制,处理到当前节点时你根本不知道 random 该指向哪个新节点。这题在题解里经常被拆成两个路线:一个叫“回溯 + 哈希表”,另一个叫“迭代 + 节点拆分”。我一开始对这两个名字很懵,后来每种都写了几遍才明白,两条路骨子里是一样的,都在做“映射”,只是一个用哈希表存映射,一个用链表位置当映射。这篇文章把两种写法从头到尾拆开讲,适合刚刷到链表拷贝、或者面试前想把深拷贝原理彻底理清的读者。
1. 在写代码前,先想清楚随机链表的三个特征
1.1 深拷贝的本质:不能共享任何一个节点
题目给了 Node 定义,包含 val、next、random。复制后需要返回整个新链表的头节点。很多人以为只要在复制时 new 一个和原节点值一样的节点,再把 random 字段照抄原节点的 random 值,就算复制完。这其实只是浅拷贝。如果新链表的 random 还是指向原链表节点,意味着新链表和原链表共享了部分节点。后面原链表一旦被修改,新链表的 random 指向的内容也会跟着变,这不符合深拷贝的要求。
深拷贝和浅拷贝的区别,可以用一个“房间地址
