728x90
연결 리스트(Linked List)
어떤 알고리즘일까?
연결리스트(Linked List)는 데이터를 순서대로 저장하는 선형 자료구조의 한 종류로, 각 요소가 노드라는 개별 단위로 존재하며, 각 노드는 데이터(value)와 다음 노드에 대한 포인터를 가지고 있다.

연결리스트의 종류
연결리스트의 종류는 노드가 가지는 포인터의 개수에 따라 달라진다.
- 단일 연결 리스트
- 각 노드가 다음 노드에 대한 포인터를 가지며, 마지막 노드는 None을 가리켜 끝을 나타낸다.
- 다음 노드에 대한 포인터만 가지기 때문에 한 방향으로만 값을 읽을 수 있다.
- 이중 연결 리스트
- 각 노드가 다음 노드와 이전 노드에 대한 포인터를 가지며, 첫 번째 노드의 이전 노드와 마지막 노드의 다음 노드는 None 값을 가진다.
- 다음 노드와 이전 노드에 대한 포인터를 모두 가지고 있기 때문에 양 방향으로 값을 읽을 수 있다.
- 원형 연결 리스트
- 마지막 노드가 다시 첫 번째 노드를 가리켜 원형을 이룬다.
- 값이 원형을 이루기 때문에 마지막 노드에서 다음 값은 첫번째 노드 값이 된다.
연결 리스트의 장단점
- 장점
- 동적 크기 조정 : 배열과 달리 연결 리스트는 미리 고정된 크기가 필요하지 않고, 데이터를 추가할 때마다 새로운 노드를 생성하여 연결만 시켜주면 되기 때문에 크기를 유연하게 조절할 수 있다.
- 효율적인 삽입/삭제 : 삽입이나 삭제가 필요한 위치의 노드만 수정하면 되므로, 중간에 데이터를 추가하거나 삭제할 때 O(1)의 시간 복잡도로 빠르게 처리할 수 있다.
- 단점
- 임의 접근 불가 : 연결 리스트는 노드들이 순차적으로 연결되어 있어, 특정 인덱스에 접근하려면 처음부터 순회해야 하므로 O(n)의 시간이 소요된다.
- 추가 메모리 사용 : 각 노드가 데이터뿐만 아니라 다음 노드에 대한 포인터를 저장해야 하므로, 배열보다 메모리를 더 많이 차지할 수 있다.
언제 사용하는가?
- 대기열 관리 : 대기열과 같이 순차적으로 처리되는 데이터 관계에 효과적이다.
- 캐시 구현 : 최근 사용된 항목을 관리하는 LRU 캐시와 같은 경우, 삽입과 삭제가 빈번하므로 이중 연결 리스트가 유용하다.
- 그래프와 인접 리스트 표현 : 그래프의 각 정점과 인접한 정점을 관리하기 위해 연결 리스트가 많이 사용된다.
연결리스트 예제
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
|
class LinkedList:
def __init__(self, val = 0, next = None):
self.val = val
self.next = next
N, K = map(int,input().split())
head = LinkedList(1)
curr_node = head
for i in range(2,N+1):
new_node = LinkedList(i)
curr_node.next = new_node
curr_node = curr_node.next
curr_node.next = head
curr_node = head
prev_node = head
cnt = 0
print("<", end="")
while cnt < N - 1:
for i in range(K-1):
prev_node = curr_node
curr_node = curr_node.next
prev_node.next = curr_node.next
print(curr_node.val, end = ", ")
curr_node = curr_node.next
cnt += 1
print(curr_node.val, end=">")
|
cs |
예제 Python code
백준에 있는 요세푸스 문제의 해결 코드이다.
각 노드가 다음 노드에 대한 정보만 담고 있으므로 단일 연결리스트를 사용한 것을 알 수 있다.
연결리스트 구현은 주로 class를 사용하며, 각 노드를 객체로 관리한다.
728x90
'[알고리즘] > [알고리즘 공부]' 카테고리의 다른 글
[알고리즘 공부] #5 큐 알고리즘(Queue) 알고리즘 with Python (0) | 2024.06.28 |
---|---|
[알고리즘 공부] #4 비트마스크(BitMask) 알고리즘 with Python (0) | 2024.06.26 |
[알고리즘 공부] #3 재귀(Recursive) 알고리즘 with Python (0) | 2024.06.06 |
[알고리즘 공부] #2 백트래킹(BackTracking) 알고리즘 with Python (2) | 2024.06.02 |
[알고리즘 공부] #1 완전 탐색, 브루트포스(Brute Force) 알고리즘 with Python (2) | 2024.05.20 |