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


题目链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof

本文解法采取两种两种编程语言: 1.JavaScript (暴力解法)  2.Java(暴力解法)

1.JavaScript

 1 /**
 2  * @param {Node} head
 3  * @return {Node}
 4  */
 5 var copyRandomList = function (head) {
 6   if (head == null) return head;
 7   let newHead = new Node(head.val, null, null);
 8   // 第一步,根据next复制链表以及其val、next;
 9   let tem1 = head.next;
10   let tem2 = newHead;
11   while (tem1 !== null) {
12     let tem3 = new Node(tem1.val, null, null);
13     tem2.next = tem3;
14     tem2 = tem2.next;
15     tem1 = tem1.next;
16   }
17   // 第二步,复制链表的random
18   let tem4 = newHead;
19   let tem5 = head;
20   // 遍历链表,复制每个结点的random
21   while (tem5 !== null) {
22     if (tem5.random === null) {
23       // 若当前结点的random
24       tem4.random = null;
25     } else {
26       let tem6 = head;
27       let tem7 = newHead;
28       // 将当前结点的random值与链表中的结点逐个比较
29       while (tem6 !== null) {
30         if (tem5.random === tem6) {
31           tem4.random = tem7;
32         }
33         tem6 = tem6.next;
34         tem7 = tem7.next;
35       }
36     }
37     tem4 = tem4.next;
38     tem5 = tem5.next;
39   }
40   return newHead;
41 };

2.Java

 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 }