👀 문제
https://leetcode.com/problems/copy-list-with-random-pointer/
👊 도전
1. 설계
- 주어진 리스트 head를 깊은 복사하여 리턴한다.
2. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
*
* @author HEESOO
*
*/
/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
*/
class Solution {
public Node copyRandomList(Node head) {
if(head==null) return head;
HashMap<Node, Node> map=new HashMap<>();
Node p=head;
while(p!=null){ // 새 노드 생성
map.put(p, new Node(p.val));
p=p.next;
}
p=head;
while(p!=null){ // 새 노드들에 next, random 연결
map.get(p).next=map.get(p.next);
map.get(p).random=map.get(p.random);
p=p.next;
}
return map.get(head);
}
}
3. 결과
🤟 성공 🤟
4. 설명
- 해시맵을 이용한다
- Key는 기존 리스트의 노드, Value는 기존 노드를 복사한 새 노드가 된다.
- 처음 while문을 통해 기존 노드와 val이 같은 새 노드를 만들어서 맵에 넣는다.
- 두 번째 while문에서 새 노드(p를 key로 가지는 값의 value)의 next와 random을 연결한다.
👏 해결 완료!
처음에는 맵의 형태를 <Integer, Node>로 하여 코드를 짰는데, 노드의 val은 중복 값이 존재하기 떄문에 해당 방법은 불가능하는 것을 알고 다른 풀이를 참고하였다.