강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

D.H Github님의 프로필 이미지
D.H Github

작성한 질문수

38군데 합격 비법, 2025 코딩테스트 필수 알고리즘

2-5. 링크드 리스트 구현 - 2

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 함수에서는 노드를 삭제할 때, 중간 단계가 누락되어 있어서 문제가 발생합니다. 현재 코드는 다음과 같은 두 가지 문제점이 있습니다:

  1. before_node = before_node.next.nextbefore_node를 제거하려는 노드의 다음 노드로 연결하는 것이 아니라 before_node를 잘못 덮어쓰고 있습니다.

  2. 제거된 노드의 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()을 통해 노드를 삭제한 후에도 링크드 리스트가 올바르게 출력될 것입니다.

코드 구현에 도움이 되셨길 바랍니다! 추가 질문이 있으시면 언제든지 말씀해 주세요. 😊

이미지:
강의자료
해당 정보는 여기에서 확인하실 수 있습니다.

D.H Github님의 프로필 이미지
D.H Github

작성한 질문수

질문하기