연결 리스트(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 메서드를 호출하여 전체 연결 리스트를 콘솔에 출력합니다.