题目出处:力扣
描述:
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例:
---
考察如何进行深拷贝;
根据题解,解法有2种,第1种为复制后拆分,第2种为使用哈希表
思路如下:
/*
解法1,复制后拆分
解法1思路如下:
next:
1->2->4->9->null
random:
1->4
2->1
4->1
9->2
1.复制链表于原链表
next:
1->1`->2->2`->4->4`->9->9`->null
random:
1->4 1`->null
2->1 2`->null
4->1 4`->null
9->2 9`->null
2.复制结点random参照原链表指向相应复制结点
next:
1->1`->2->2`->4->4`->9->9`->null
random:
1->4 1`->4`
2->1 2`->1`
4->1 4`->1`
9->2 9`->2`
3.将链表拆分成两个链表
next:
1->2->4->9->null
1`->2`->4`->9`->null
random:
1->4 1`->4`
2->1 2`->1`
4->1 4`->1`
9->2 9`->2`
完成深拷贝
*/
/*
解法2 哈希表解法
next:
1->2->4->9->null
random:
1->4
2->1
4->1
9->2
1.将所有结点new一个一样的结点,存入哈希表
hashmap:
1-1` 2-2` 4-4` 9-9`
2.建立指向的映射关系
next:
hashmap(1) -> hashmap(1.next) ---> 1` -> hashmap(4) ---> 1`->4`
整理如下:
1`->2`->4`->9`->null
random:
1`->hashmap(1.random) ---> 1`->hashmap(4) ---> 1`->4`
2`->hashmap(2.random) ---> 2`->hashmap(1) ---> 2`->1`
4`->hashmap(4.random) ---> 4`->hashmap(1) ---> 4`->1`
9`->hashmap(9.random) ---> 9`->hashmap(2) ---> 9`->2`
整理如下:
1`->4`
2`->1`
4`->1`
9`->2`
即
next:
1`->2`->4`->9`->null
random:
1`->4`
2`->1`
4`->1`
9`->2`
完成深拷贝
*/
复制后拆分代码量比较大, 稍后再实现,先选择实现哈希表做法:
实现如下:(可以对照着上面的思路看代码实现)
public Node copyRandomList(Node head) {
HashMap<Node, Node> hashMap = new HashMap<>();
Node cur = head;
while (cur != null) {//加入哈希表中
hashMap.put(cur, new Node(cur.val));
cur = cur.next;
}
cur = head;//指针归原位
Node tar = null;
tar = hashMap.get(cur);
while (cur != null){
hashMap.get(cur).next = hashMap.get(cur.next);
hashMap.get(cur).random = hashMap.get(cur.random);
cur = cur.next;
}
return tar;
}