연결 리스트(Linked List)
Linked List란, 원소 간의 연결(link)을 이용해서 리스트를 구현한 것이다.
이전 포스트에서 설명한 Array List는 논리적인 순서와 물리적인 순서가 같기 때문에 원소의 위치를 찾아 접근하기 쉽다는 장점이 있지만, 삽입이나 삭제 후에 연속적인 물리 주소를 유지하기 위해서 원소들을 이동시키는 추가적인 작업과 시간이 필요하다. 하지만 연결 리스트는 리스트를 연결 자료구조 방식으로 표현한 구조로서, 원소들끼리 연결되어 있기 때문에 삽입이나 삭제를 할 때 연결만 달리 해주면 된다. 따라서 원소들을 이동시키는 추가적인 작업이 필요하지 않다.
노드
연결 자료구조 방식에서 원소는 연결될 다음 원소에 대한 주소를 저장해야 하기 때문에 <원소, 주소>의 단위로 저장해야 한다. 이러한 단위 구조를 노드(node)라고 한다. 각각의 노드가 다음 노드의 주소를 알고 있기 때문에 하나의 연결된 값의 모임을 만들 수 있는 것이다.
연결 리스트 삽입
1) 리스트의 맨 앞에 노드 삽입
- ① new <- getNode() : 삽입할 노드를 자유 공간 리스트에서 할당받는다.
- ② new.data <- x : 새 노드의 데이터 필드에
x
를 저장한다. - ③ new.link <- L : 리스트
L
의 첫 번째 노드에 대한 참조값을 삽입할 새 노드new
의 링크 필드에 저장함으로써 새 노드new
를 리스트L
의 첫 번째 노드와 연결한다. - ④ L <- new : 참조변수
L
에 새 노드에 대한 참조값700
을 저장하여L
이 새 노드new
를 첫 번째 노드로 가리키도록 지정한다.
1 | insertFirstNode(L, x) |
2) 리스트의 중간에 노드 삽입
- ① new.link <- pre.link : 참조변수
pre
는 삽입할 위치의 앞 노드를 가리킨다. 따라서pre
가 가리키는 노드의 다음 노드로 새 노드new
를 연결해야 하므로 노드pre
의 링크 필드값200
을 노드new
의 링크 필드에 저장하여, 새 노드new
가 노드pre
의 다음 노드를 가리키게 한다. - ② pre.link <- new :
new
의 주소700
을 노드pre
의 링크 필드에 저장하여pre
가 가리키는 노드의 다음 노드로서 새 노드new
를 연결한다.
1 | insertMiddleNode(L, pre, x) |
3) 리스트의 마지막에 노드 삽입
temp
를 사용해서 가장 마지막 노드가 무엇인지 찾고, 가장 마지막 노드의 링크 필드값에 new
의 주소700
을 저장하여 가장 마지막 노드가 새 노드 new
를 가리키게 한다.
1 | insertLastNode(L, x) |
연결 리스트 삭제
삭제할 노드를 가리키는 참조변수 old
와 삭제할 노드의 바로 앞의 노드를 가리키는 참조변수 pre
를 이용하여 노드를 하나 삭제할 수 있다.
- ① old <- pre.link :
old
는 삭제할 노드를 지시해야 하므로 노드pre
의 링크 필드값을 저장한다. - ② pre.link <- old.link : 삭제할 노드
old
의 다음 노드를 노드pre
의 다음 노드로 연결한다.
1 | deleteNode(L, pre) |
추가
자료구조 List 시각화 사이트를 참고하여 리스트에 대해 확실히 알아두자.