复杂链表的复制

题目:

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

 

示例 1:

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

 

示例 2:


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

示例 3:

示例 4:

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

提示:

-10000 <= Node.val <= 10000
Node.random 为空(null)或指向链表中的节点。
节点数目不超过 1000 。

 

解答:

这道题目,找不到技巧会很烦;最佳方法是每个节点后复制一个一模一样的,比如A->B->C则转换为A->A'->B->B'->C->C',其中N与N'的值是相同的;这样对于任意节点N则有N'.random = N.random.next;最后将A->A'->B->B'->C->C'拆回A->B->C和A'->B'->C',A'->B'->C'作为返回,A->B->C赋给head;

 1 /*
 2 // Definition for a Node.
 3 class Node {
 4     int val;
 5     Node next;
 6     Node random;
 7 
 8     public Node(int val) {
 9         this.val = val;
10         this.next = null;
11         this.random = null;
12     }
13 }
14 */
15 class Solution {
16     public Node copyRandomList(Node head) {
17         if(head == null){
18             return null;
19         }
20         Node node = head;
21         //复制节点
22         while(node != null){
23             Node next = node.next;
24             Node t = new Node(node.val);
25             node.next = t;
26             t.next = next;
27             node = next;
28         }
29         node = head;
30         //组装random
31         while(node != null && node.next != null){
32             if(node.random != null){
33                 node.next.random = node.random.next;
34             }
35             node = node.next.next;
36         }
37         //拆回两个链表
38         Node r = new Node(0);
39         Node s = r;
40         node = head;
41         Node o = new Node(0);
42         Node n = o;
43         while(node != null){
44             o = node;
45             r.next = node.next;
46             o.next = node.next.next;
47             r = r.next;
48             o = o.next;
49             node = node.next;
50         }
51         head = n;
52         return s.next;
53     }
54 }

 

posted @ 2020-04-23 19:46  heaven夏  阅读(115)  评论(0编辑  收藏  举报