파이썬 연결 리스트를 다룰 때 흔히 실수하는 참조 업데이트 문제

개발공부를해보자·2025년 1월 18일

공부 정리

목록 보기
11/34
  • min_head = lists[0], min_head = min_head.next
    라고 하더라도 lists[0]은 바뀌지 않는다.
  • min_head는 복사본이라 생각하면 된다. 복사본만 바뀌는 것이다.
  • 사실 이건 연결리스트랑 무관한다.
  • b=[1], a=b[0], a=2 라고 하면 b=[1]인 것이랑 마찬가지이다.
  • 하지만 연결리스트는 뭔가 다를 것이라 착각했었다.
  • 아래 내용은 GPT의 도움을 받아 정리한 내용이다.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

# 연결 리스트 생성
list1 = ListNode(1, ListNode(3, ListNode(5)))  # 1 -> 3 -> 5
list2 = ListNode(2, ListNode(4))               # 2 -> 4
lists = [list1, list2]  # 리스트에 연결 리스트 포함

# 잘못된 방법
min_head = lists[0]  # lists[0]의 복사본 역할
print(f"Before update (잘못된 방법): min_head={min_head.val}, lists[0]={lists[0].val}")
#Before update (잘못된 방법): min_head=1, lists[0]=1

min_head = min_head.next  # 복사본만 업데이트
print(f"After update (잘못된 방법): min_head={min_head.val}, lists[0]={lists[0].val}")
#After update (잘못된 방법): min_head=3, lists[0]=1
# 결과: lists[0]는 변경되지 않고, min_head만 변경됨

# 올바른 방법
min_index = 0  # 첫 번째 연결 리스트 선택
print(f"Before update (올바른 방법): lists[0]={lists[0].val}")
Before update (올바른 방법): lists[0]=1

lists[min_index] = lists[min_index].next  # 원본 업데이트
print(f"After update (올바른 방법): lists[0]={lists[0].val}")
After update (올바른 방법): lists[0]=3
# 결과: lists[0]가 다음 노드로 변경됨
profile
개발 공부하는 30대 비전공자 직장인

0개의 댓글