Ch.5 연결 리스트
면접실전 — Linked List 핵심 문제 5선
면접관이 좋아하는 연결 리스트 문제 5개
연결 리스트는 면접에서 포인터 조작 능력을 테스트하는 최고의 주제입니다. 5가지 대표 문제를 통해 실전 감각을 키웁니다.
코드를 외우는 게 아니라, 패턴을 익혀야 변형에 대응할 수 있다
각 문제의 핵심 패턴을 정리하고, 면접에서 어떻게 설명할지 연습합니다.
핵심 내용
LeetCode 206 Reverse Linked List
def reverseList(head):
prev = None
curr = head
while curr:
nxt = curr.next
curr.next = prev
prev = curr
curr = nxt
return prev
# 시간 O(n), 공간 O(1)패턴: 3포인터(prev/curr/nxt) — 연결 리스트 면접의 기본 중 기본
LeetCode 21 Merge Two Sorted Lists
def mergeTwoLists(l1, l2):
dummy = ListNode(0)
curr = dummy
while l1 and l2:
if l1.val <= l2.val:
curr.next = l1
l1 = l1.next
else:
curr.next = l2
l2 = l2.next
curr = curr.next
curr.next = l1 or l2 # 남은 리스트 연결
return dummy.next
# 시간 O(n+m), 공간 O(1)패턴: dummy head + 두 포인터 비교 — Merge Sort의 merge 단계와 동일
LeetCode 141 / 142 Linked List Cycle I & II
# Cycle I: 사이클 존재 여부
def hasCycle(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
# Cycle II: 사이클 시작점
def detectCycle(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
slow = head
while slow != fast:
slow = slow.next
fast = fast.next
return slow
return None패턴: Fast & Slow (Floyd's) — 사이클 + 중간 노드 문제의 만능 도구
LeetCode 19 Remove Nth Node From End of List
def removeNthFromEnd(head, n):
dummy = ListNode(0)
dummy.next = head
fast = slow = dummy
# fast를 n+1칸 앞으로
for _ in range(n + 1):
fast = fast.next
# 같이 이동 → fast가 끝이면 slow는 삭제 대상 앞
while fast:
fast = fast.next
slow = slow.next
slow.next = slow.next.next # 삭제
return dummy.next
# 시간 O(n), 공간 O(1), 한 번의 순회패턴: 두 포인터 간격 유지 + dummy head — 끝에서 n번째를 한 번 순회로 찾기
LeetCode 146 LRU Cache — 면접 빈출 Top 5
class LRUCache:
def __init__(self, capacity):
self.cap = capacity
self.cache = {} # key → Node
self.head = DLLNode() # dummy head
self.tail = DLLNode() # dummy tail
self.head.next = self.tail
self.tail.prev = self.head
def get(self, key): # O(1)
if key not in self.cache: return -1
node = self.cache[key]
self._remove(node)
self._add_front(node)
return node.val
def put(self, key, val): # O(1)
if key in self.cache:
self._remove(self.cache[key])
node = DLLNode(key, val)
self.cache[key] = node
self._add_front(node)
if len(self.cache) > self.cap:
lru = self.tail.prev
self._remove(lru)
del self.cache[lru.key]패턴: HashMap + Doubly Linked List — 조회 O(1) + 삽입/삭제 O(1)
Linked List 면접 패턴 5가지 1. 3포인터 Reverse: prev/curr/nxt 2. Dummy Head + Merge: 두 리스트 병합 3. Fast & Slow: 사이클, 중간 노드 4. 간격 유지 두 포인터: 끝에서 n번째 5. HashMap + DLL: LRU Cache
두 정렬된 리스트를 병합할 때 dummy head를 사용하는 이유는?
Remove Nth From End에서 fast를 n+1칸 먼저 보내는 이유는?
면접에서 LRU Cache를 OrderedDict로만 구현하면 만점을 받을 수 있다
면접실전 5문제 정복!
정리 노트
Linked List 면접 핵심 문제 5선
필수 문제
- LC 206
- Reverse — 3포인터
- LC 21
- Merge Two Lists — dummy + 비교
- LC 141/142
- Cycle — Fast & Slow
- LC 19
- Remove Nth — 간격 유지 두 포인터
- LC 146
- LRU Cache — HashMap + DLL
공통 테크닉
- dummy head
- head 변경 가능 문제의 엣지 케이스 제거
- 포인터 순서
- 연결 끊기 전에 다음 노드 미리 저장
5문제를 30분 안에 풀 수 있으면 Linked List 면접은 합격권!
시각 자료
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작