题目(复杂链表的复制—牛客网)
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
算法思路
算法分为三步。
第一步:对于链表中的每个节点 N ,它的复制节点 N’,链接到它的后面,这样复制完后,形成了新的链表。(N’链接到 N 的下一个节点)
第二步:链接随机节点。采用第一步的构造方式给第二步带来了遍历。因为原链表中节点 N 的随机节点的下一个节点就是 节点 N’ 的随机节点,这样一来就可以遍历新链表中原链表的那些节点就行了。
第三步:将新链表拆分成原链表和复制链表。定义复制链表头结点以及其工作指针用于链接所有复制节点。再定义原链表的工作指针,用于链接原链表中的节点,最后整个新的链表就被两个工作指针拆分成了两个链表。
算法实现
复杂度分析
算法对原链表在线性时间内遍历,因此时间复杂度为 O(n),空间复杂度为 O(1)(生成节点不算)
参考
<<剑指offer2>>