연결 리스트(Linked List)는 노드(Node)들이 포인터로 연결된 자료구조
배열과 다르게 연속된 메모리 공간이 필요 없고, 동적으로 크기를 조절할 수 있는 장점
하지만 접근 속도가 느리고, 추가적인 메모리(포인터)가 필요함
O(N), 요소 이동 필요)O(1), 포인터만 변경)O(1), 인덱스로 접근 가능)O(N), 처음부터 탐색)next) 필요
데이터 + 다음 노드의 주소(next)를 저장None(=끝)을 가리킴
다음 노드(next)만 가리킴이전 노드(prev)와 다음 노드(next)를 모두 가짐
O(1), 빠름)class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_front(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_nodeO(N), 마지막 노드 찾기 필요)def insert_end(self, data):
new_node = Node(data)
if not self.head:
self.head = new_node
return
temp = self.head
while temp.next:
temp = temp.next
temp.next = new_nodeO(1), 빠름)def delete_front(self):
if self.head:
self.head = self.head.nextO(N), 탐색 필요)def delete_value(self, key):
temp = self.head
if temp and temp.data == key:
self.head = temp.next
return
prev = None
while temp and temp.data != key:
prev = temp
temp = temp.next
if temp:
prev.next = temp.nextO(N))def search(self, key):
temp = self.head
while temp:
if temp.data == key:
return True
temp = temp.next
return False def print_list(self):
temp = self.head
while temp:
print(temp.data, end=" → ")
temp = temp.next
print("None")
| 연산 | 평균 시간 복잡도 |
|---|---|
| 삽입(Insert) 맨 앞 | O(1) |
| 삽입(Insert) 맨 끝 | O(N) |
| 삭제(Delete) 맨 앞 | O(1) |
| 삭제(Delete) 맨 끝 | O(N) |
| 탐색(Search) | O(N) |
O(N))O(1))O(1))O(N), 요소 이동 필요)장점
O(1), 맨 앞 기준)단점
O(N), 순차 탐색 필요)언제 사용하면 좋을까?