인프런 커뮤니티 질문&답변
Linked List Element Delete Explanation Problem
해결된 질문
작성
·
34
0
1. 현재 학습 진도
몇 챕터/몇 강을 수강 중이신가요?
어떤 알고리즘을 학습하고 계신가요?
여기까지 이해하신 내용은 무엇인가요?
2. 어려움을 겪는 부분
어느 부분에서 막히셨나요?
코드의 어떤 로직이 이해가 안 되시나요?
어떤 개념이 헷갈리시나요?
3. 시도해보신 내용
문제 해결을 위해 어떤 시도를 해보셨나요?
에러가 발생했다면 어떤 에러인가요?
현재 작성하신 코드를 공유해주세요
이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊
아래 코드(TODO; 제가 만든 삭제코드, 정답지; 제공된 교재 답 풀이본) 에 대해 문의드립니다.
5,9,12,27 일때 정답지를 통해 결과를 뽑아보면 삭제가 안되는 현상이 일어납니다. 이와 관련해 어떻게 생각하실지 여쭙습니다!
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self, value):
self.head = Node(value)
def append(self, value):
cur = self.head
while cur.next is not None:
cur = cur.next
cur.next = Node(value)
def print_all(self):
cur = self.head
while cur is not None:
print(cur.data)
cur = cur.next
def get_node(self, index):
node = self.head
count = 0
while count < index:
node = node.next
count += 1
return node
def add_node(self, index, value):
new_node = Node(value)
if index == 0:
new_node.next = self.head
self.head = new_node
return
node = self.get_node(index - 1)
next_node = node.next
node.next = new_node
new_node.next = next_node
# def delete_node(self, index): # TODO
# if index == 0: # 첫번째 노드를 불러와야 출력이 가능하므로 0번째 인덱스를 제거하려고하면 1번쨰 인덱스를 head로 지정
# self.head = self.head.next
# return
# before_node = self.get_node(index-1) # 1. 제거해야할 노드 이전 노드 찾기
# delete_node = self.get_node(index)
# before_node.next = delete_node.next # 2. 이전 노드 next를 제거할 노드의 next로
# delete_node.next = None # 3. 제거할 노드의 next 를 None
# return "index 번째 Node를 제거해주세요!"
def delete_node(self, index): # 정답지
if index == 0: # 첫번째 노드를 불러와야 출력이 가능하므로 0번째 인덱스를 제거하려고하면 1번쨰 인덱스를 head로 지정
self.head = self.head.next
return
before_node = self.get_node(index-1) # 1. 제거해야할 노드 이전 노드 찾기
before_node = before_node.next.next
return "index 번째 Node를 제거해주세요!"
linked_list = LinkedList(5)
linked_list.append(9)
linked_list.append(12)
linked_list.append(27)
print("제거 전")
linked_list.print_all()
print("제거 후")
linked_list.delete_node(3)
linked_list.print_all()
답변 2
0
안녕하세요 D.H 님 좋은 질문 감사합니다!
delete_node 함수에서 아래 코드가 다른 것 같습니다!
# 제출해주신 내용
before_node = before_node.next.next # ❌ 변수에 새 값을 "할당"만 함
# 교재의 코드
node.next = node.next.next # ✅ 포인터를 실제로 "연결" 변경차이가 보이시나요? = 왼쪽이 다릅니다.
제출해주신 코드는 before_node라는 지역 변수에 새로운 노드 주소를 담기만 하고, 실제 연결 리스트의 연결 구조는 전혀 건드리지 않아요. 마치 "다음 칸 주소 메모지를 새로 쓴 것"일 뿐, 기차 연결고리 자체를 바꾼 게 아닙니다
반면 node.next = ...는 실제로 해당 노드의 next 포인터, 즉 "연결고리 자체"를 변경하는 거예요.한 번 해당 부분을 수정해보시고 해결해보시면 좋을 것 같습니다!
직접 코드를 작성해보시고 시도해보시는 점 넘넘 좋습니다! 편하게 또 질문주세요 감사합니다
0
안녕하세요, 인프런 AI 인턴입니다.
D.H Github님께서 작성하신 delete_node 함수에서 문제가 발생하는 이유를 설명드리겠습니다.
정답지로 제공된 delete_node 함수에서는 노드를 삭제할 때, 중간 단계가 누락되어 있어서 문제가 발생합니다. 현재 코드는 다음과 같은 두 가지 문제점이 있습니다:
before_node = before_node.next.next는before_node를 제거하려는 노드의 다음 노드로 연결하는 것이 아니라before_node를 잘못 덮어쓰고 있습니다.제거된 노드의
next속성을None으로 설정하는 과정이 누락되어 메모리 누수가 발생할 수 있습니다.
delete_node 메서드는 다음과 같이 작성하는 것이 올바릅니다:
def delete_node(self, index):
if index == 0:
self.head = self.head.next
return
before_node = self.get_node(index-1)
delete_node = before_node.next
before_node.next = delete_node.next
delete_node.next = None
return "Node 삭제 완료했습니다!"
이제 print_all()을 통해 노드를 삭제한 후에도 링크드 리스트가 올바르게 출력될 것입니다.
코드 구현에 도움이 되셨길 바랍니다! 추가 질문이 있으시면 언제든지 말씀해 주세요. 😊




