剑指 Offer 35. 复杂链表的复制

题目:

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

示例 1:

剑指 Offer 35. 复杂链表的复制

 

 

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

剑指 Offer 35. 复杂链表的复制

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

剑指 Offer 35. 复杂链表的复制

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

示例 4:
输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

剑指 Offer 35. 复杂链表的复制

 1 class Node {
 2     int val;
 3     Node next;
 4     Node random;
 5 
 6     public Node(int val) {
 7         this.val = val;
 8         this.next = null;
 9         this.random = null;
10     }
11 }
12 
13 /**
14  * @author 不乏理想的三师弟
15  * 解法一
16  */
17 public Node copyRandomList(Node head) {
18     if(head == null) return null;
19     // 第一步:忽略random,复制一条链。
20     Node myHead = new Node(head.val);
21     Node tem = null;
22     Node tem2 = null;
23     if(head.next != null) {
24         tem = new Node(head.next.val);
25         myHead.next = tem;
26         tem2 = head.next.next;
27     }
28     while(tem2 != null) {
29         tem.next = new Node(tem2.val);
30         tem = tem.next;
31         tem2 = tem2.next;
32     }
33     /**
34      * 第二步:遍历链表,依次找出结点的random并复制
35      * 难点:确认random所指向结点的相对位置
36      * (题目要求:不只是要求值的相同,而且结点的相对位置也得相同)
37      * 手段:通过对比random所指结点的next是哪一个结点就知道其相对位置了
38      */
39     Node temMyHead = myHead;
40     Node temHead = head;
41     Node tem3;
42     
43     while(temHead != null) {
44         if(temHead.random == null) {
45             temMyHead.random = null;
46         }else {
47             // 保存当前结点random所指结点的next结点
48             tem = temHead.random.next; // tem变量的重复利用
49             // 再次遍历链表
50             tem2 = head;    // tem2变量的重复利用
51             tem3 = myHead;
52             while(tem2 != null) {
53                 if(tem2.next == tem) {
54                     temMyHead.random = tem3;
55                     break;
56                 }
57                 tem2 = tem2.next;
58                 tem3 = tem3.next;
59             }
60         }
61         temHead = temHead.next;
62         temMyHead = temMyHead.next;
63     }
64     return myHead;
65 }

 

剑指 Offer 35. 复杂链表的复制

上一篇:添加磁盘分区,格式化,挂载


下一篇:任何非负整数(除了 9 的整数倍)模 9 等与该数字的各数位上位数的和