forked from onlybooks/java-algorithm-interview
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathP30_1.java
97 lines (91 loc) · 3.03 KB
/
P30_1.java
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package ch11;
class P30_1 {
// 노드 클래스
static class Node {
int key, val;
Node next;
Node(int key, int val) {
this.key = key;
this.val = val;
}
}
final Node[] nodes = new Node[1000000];
// 삽입
public void put(int key, int value) {
// 해싱 결과를 인덱스로 지정
int index = key % nodes.length;
// 해당 인덱스에 노드가 없다면 신규 생성 후 종료
if (nodes[index] == null) {
nodes[index] = new Node(key, value);
return;
}
// 인덱스에 노드가 존재한다면 연결 리스트로 처리
Node node = nodes[index];
while (node != null) {
// 동일한 키가 있다면 값을 업데이트하고 종료
if (node.key == key) {
node.val = value;
return;
}
// 다음 노드가 없다면 종료
if (node.next == null)
break;
// 다음 노드로 진행
node = node.next;
}
// 마지막 노드 다음으로 연결
node.next = new Node(key, value);
}
// 조회
public int get(int key) {
// 해싱 결과를 인덱스로 지정
int index = key % nodes.length;
// 인덱스에 노드가 존재하지 않으면 -1
if (nodes[index] == null)
return -1;
// 인덱스에 노드가 존재한다면 일치하는 키 탐색
Node node = nodes[index];
while (node != null) {
// 동일한 키가 있다면 값을 리턴
if (node.key == key) {
return node.val;
}
// 다음 노드로 진행
node = node.next;
}
// 인덱스를 모두 순회해도 일치하는 키가 없다면 -1
return -1;
}
// 삭제
public void remove(int key) {
// 해싱 결과를 인덱스로 지정
int index = key % nodes.length;
// 해당 인덱스에 노드가 없다면 종료
if (nodes[index] == null)
return;
// 첫 번째 노드일 때의 삭제 처리
Node node = nodes[index];
// 일치하는 키가 있다면
if (node.key == key) {
// 다음 노드가 없으면 해당 인덱스는 null 처리
if (node.next == null)
nodes[index] = null;
// 다음 노드가 있다면 다음 노드를 해당 인덱스로 지정
else
nodes[index] = node.next;
}
// 연결 리스트 노드일 때의 삭제 처리
Node prev = node;
while (node != null) {
// 일치하는 키가 있다면
if (node.key == key) {
// 이전 노드의 다음에 현재 노드의 다음을 연결하고 리턴
prev.next = node.next;
return;
}
// 노드 한 칸씩 이동
prev = node;
node = node.next;
}
}
}