Array: 0: 12 1: 99 2: 37
Linked List: head → 12 → 99 → 37 → ∅
const list = {
head: {
value: 12
next: {
value: 99
next: {
value: 37
next: null
}
}
}
};
느낌이 head로 시작해서 value가 있고 next로 데이터들이 연결되는 느낌
그리고 마지막의 tail의 값은 null이 되면 될 것 같은 느낌
메모리의 효율적 사용 가능
데이터를 저장하고 이전 데이터와 다음 데이터를 연결만 해주면 되기 때문에
메모리의 공간 사용이 용이하다.
아래의 그림을 참조하면 바로 이해가 될 것 같다.
(List)
(List)
Linked List default 리스트 생성function List (데이터) { // this.head = null; // this.tail = null; 필요시 tail 이 무엇인지도 바로 확인 가능) } // 기본
(node)
(node)
Linked List의 데이터 단위인 노드 생성function Node (데이터) { // this.value = 데이터 // this.next = null; } let myNode = new Node(데이터이름) // 노드의 클래스를 만들고 인스턴스를 생성
(addToTail)
(addToTail)
리스트의 가장 끝에 데이터를 추가List.addToTail = function(데이터) { // if (리스트에 노드가 없으면) head에 첫 노드를 추가 // else 꼬리에 노드 추가 }
(removeHead)
(removeHead)
리스트의 헤드를 삭제List.removeHead = function() { // head를 삭제 // head에 연결되어 있는 두 번째 노드를 head로 변경 }
(removeValue)
(removeValue)
리스트에 있는 데이터를 삭제List.removeValue = function(데이터) { // 리스트의 next를 따라가면서 데이터가 있는지 확인 // 있으면 삭제 // 삭제 후 데이터 전 후의 데이터를 연결해주는 작업 필요 }
(hasValue)
(hasValue)
리스트에 데이터가 있는지 확인List.hasValue = function(데이터) { // 리스트의 head 부터 차례대로 돌면서 데이터가 있는지 확인 // 리스트의 경우 index가 없기 때문에 head부터 돌아야 함 // 있으면 true, 없으면 false 반환 }
Array List
vs Linked List
첫번째 회사는 모든 직원이 한곳에 모여있어야 한다는 철학이 있기 때문에 사무실이 모여있습니다. 배열은 건물을 이런 식으로 사용하는 것과 비슷합니다. 만약 회사가 성장해서 사무실이 좁아지면 더 이상 새로운 직원을 뽑을 수 없습니다. 붙어있는 공간이 없기 때문이죠. 만약 더 많은 공간이 필요하다면 더 많은 사람을 수용할 수 있는 공간을 찾아서 전체가 이사해야 합니다.
linked list는 한 건물 내에서 한 회사가 임대한 사무실이 서로 떨어져 있습니다. 덕분에 직원이 늘어도 큰 걱정이 없습니다. 건물에서 비어있는 곳 아무데나 임대해서 들어가면 되니까요. 그런데 방문자가 사무실을 찾는 방법이 좀 비효율적입니다. 위의 그림에 있는 방문자가 3번째 사무실을 찾아가려면 우선 첫 번째 화살표의 사무실을 찾아가야 합니다. 이 사무실의 직원에게 다음 사무실이 어딘지 물어봅니다. 그럼 알려주는 사무실로 이동 한 후에 다시 물어봐서 그다음 사무실로 이동합니다.
이렇게 물어물어 사무실을 찾아가야 하는 방식이 linked list입니다. 그래서 linked list에서는 몇 번째 엘리먼트를 찾는 것이 느립니다.
반면에 array list는 엘리먼트가 같은 곳에 모여있습니다. 만약에 3번째 자리로 가고 싶다면 한번에 3번째 방으로 갈 수 있습니다. 찾고자 하는 사무실이 몇 번째에 있는지 알고 있다면 ArrayList는 매우 빠릅니다.