Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 재귀 함수로 연결 리스트의 모든 노드 출력하기

연결 리스트(Linked List)에 저장된 요소들을 화면에 출력해야 할 때, 재귀(Recursion) 방식을 활용하면 코드를 간결하고 우아하게 작성할 수 있습니다. 이를 위해서는 연결 리스트에 값을 추가하는 메서드와, 리스트의 모든 노드를 출력하는 메서드가 필요합니다. 또한 실제 재귀 호출을 담당하는 헬퍼(helper) 메서드를 별도로 두어, 자기 자신을 반복적으로 호출하면서 각 노드의 값을 순서대로 출력하도록 구현합니다.

아래는 그 구현 예시입니다.

예제 코드

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class my_linked_list:
    def __init__(self):
        self.head = None
        self.last_node = None

    def add_value(self, my_data):
        if self.last_node is None:
            self.head = Node(my_data)
            self.last_node = self.head
        else:
            self.last_node.next = Node(my_data)
            self.last_node = self.last_node.next

    def print_it(self):
        self.helper_print(self.head)

    def helper_print(self, curr):
        if curr is None:
            return

        print(curr.data)
        self.helper_print(curr.next)

my_instance = my_linked_list()
n = int(input('How many elements you wish to add ? '))
for i in range(n):
    data = int(input('Enter a data item : '))
    my_instance.add_value(data)

print('The linked list: ')
my_instance.print_it()

실행 결과

How many elements you wish to add ? 4
Enter a data item : 34
Enter a data item : 67
Enter a data item : 12
Enter a data item : 89
The linked list:
34
67
12
89

코드 설명

  • 'Node' 클래스를 생성합니다. 이 클래스는 노드가 담고 있는 데이터(data)와 다음 노드를 가리키는 참조(next)를 저장합니다.

  • 필요한 속성을 갖춘 'my_linked_list' 클래스를 정의합니다.

  • __init__ 함수에서는 첫 번째 노드인 'head'와 마지막 노드인 'last_node'를 None으로 초기화합니다.

  • 'add_value' 메서드는 연결 리스트의 맨 끝에 새로운 데이터를 추가하는 역할을 합니다. 리스트가 비어 있으면 head를 설정하고, 그렇지 않으면 last_node 뒤에 새 노드를 연결합니다.

  • 'print_it' 메서드는 헬퍼 메서드를 호출하여 콘솔에 연결 리스트의 데이터를 출력합니다.

  • 'helper_print' 메서드는 현재 노드의 데이터를 출력한 뒤, 다음 노드를 인자로 넘기며 자기 자신을 재귀적으로 호출합니다.

  • 현재 노드가 None일 때 반환되는 부분이 바로 재귀의 종료 조건(베이스 케이스)입니다. 이 조건 덕분에 무한 호출 없이 마지막 노드까지 안전하게 순회할 수 있습니다.

  • 재귀 로직을 분리하기 위해 별도의 헬퍼 함수를 정의했습니다. 이렇게 하면 외부에는 간단한 인터페이스만 노출됩니다.

  • 'my_linked_list' 클래스의 객체(인스턴스)를 생성합니다.

  • 사용자로부터 추가할 요소의 개수를 입력받습니다.

  • 입력받은 개수만큼 반복문을 돌며 add_value 메서드를 호출해 데이터를 하나씩 추가합니다.

  • 마지막으로 print_it 메서드를 호출하여 전체 연결 리스트를 콘솔에 출력합니다.