"연결 리스트 뒤집기는 그 면접 질문이야. 어려워서가 아니라, 가짜로 못 해서: 포인터랑 그걸 다시 잇는 순서가 너한테 진짜인지, 그냥 단어인지를 시험해."
머릿속 그림
1 → 2 → 3 → None 이 있고 3 → 2 → 1 → None 을 원해. 데이터는 안 움직여 — 화살표만 뒤집혀. 리스트를 걸으며, 각 노드에서 그 next 화살표를 방금 온 노드로 가리키게 돌려. 일 전부가 "각 화살표를 하나씩 뒤로 뒤집되, 하는 동안 리스트 나머지를 안 잃기" 야.
반복 방식: 세 포인터
고전 해법은 걸으며 참조 셋을 들어: prev (네 뒤 노드, 이 화살표가 이제 가리켜야 할 곳), curr (네가 뒤집는 노드), 그리고 저장한 next (curr.next 를 뒤집는 순간 리스트 나머지를 안 잃게). 각 단계: curr.next 를 챙기고, curr.next = prev 로 뒤집고, 셋을 다 앞으로 밀어. curr 가 끝에서 떨어지면, prev 가 새 head 야. O(n) 시간, O(1) 공간 — 변수 셋으로 전체를 뒤집었어.
반복문 안 순서가 난이도 전부고, 첫 lesson 의 그 규칙이야: 덮어쓰려는 걸 덮어쓰기 전에 저장해. 옛 next 를 저장하기 전에 curr.next 를 뒤집으면 리스트 나머지가 허공으로 사라져.
재귀 방식: 우아하지만 더 무거움
재귀는 몇 줄에 리스트를 뒤집을 수 있어: 나머지 리스트를 뒤집고, 다음 노드가 현재 노드를 되가리키게 해. 아름답게 읽혀 — 근데 모든 재귀 호출이 base case 가 반환할 때까지 콜 스택에 앉아서, O(n) 공간이 들고, 아주 긴 리스트에선 스택을 터뜨릴 수 있어 (RecursionError). 재귀 사고의 사랑스러운 시연이지만 (Recursion 트랙이 충분히 탐구해), production 에선 보통 반복 O(1)-공간 버전이 맞는 선택이야.
피파의 고백
curr.next = prev 를 뒤집었어 — 내 리스트의 3분의 2 가 증발하는 걸 봤어. 아빠는 답을 안 줬어; 상자 네 개를 그리고 각 화살표를 순서대로 물리적으로 지우고-다시-그리게 했어. 종이에 손으로 하니 순서가 박혔어: next 저장, 뒤집기, prev 전진, curr 전진. 그 뒤로 잘못된 순서 재연결로 리스트를 잃은 적이 없어. 어떤 건 타이핑하기 전에 그려봐야 해.