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

파이썬으로 연결 리스트(Linked List) 내 요소별 발생 횟수 구하기

연결 리스트(Linked List)에서 특정 요소가 몇 번 나타나는지 확인해야 하는 경우가 있습니다. 이를 위해 요소를 추가하는 메서드, 리스트를 출력하는 메서드, 그리고 각 요소의 발생 횟수를 계산하는 메서드를 정의하여 해결할 수 있습니다.

아래는 전체 구현 예제입니다.

예제 코드

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

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

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

    def print_it(self):
        curr = self.head
        while curr:
            print(curr.data)
            curr = curr.next

    def count_elem(self, key):
        curr = self.head
        count_val = 0
        while curr:
            if curr.data == key:
                count_val = count_val + 1
            curr = curr.next
        return count_val

my_instance = LinkedList_structure()
my_list = [56, 78, 98, 12, 34, 55, 0]
for elem in my_list:
    my_instance.add_vals(elem)
print('연결 리스트의 내용 : ')
my_instance.print_it()

key_val = int(input('찾을 데이터 입력: '))
count_val = my_instance.count_elem(key_val)
print('{0}은(는) 리스트에서 {1}번 나타납니다.'.format(key_val, count_val))

실행 결과

연결 리스트의 내용 :
56
78
98
12
34
55
0
찾을 데이터 입력 0
0은(는) 리스트에서 1번 나타납니다.

코드 설명

  • 먼저 노드를 표현하는 'Node' 클래스를 생성합니다. 각 노드는 데이터(data)와 다음 노드를 가리키는 포인터(next)로 구성됩니다.

  • 필요한 속성을 가진 'LinkedList_structure' 클래스를 정의합니다.

  • 이 클래스에는 '__init__' 함수가 있으며, 리스트의 첫 번째 요소인 'head'와 마지막 노드인 'last_node'를 'None'으로 초기화합니다.

  • 'add_vals' 메서드는 연결 리스트 끝에 새로운 값을 추가하는 역할을 합니다.

  • 'print_it' 메서드는 연결 리스트의 모든 값을 콘솔에 순서대로 출력합니다.

  • 'count_elem' 메서드는 매개변수로 받은 key 값과 일치하는 요소의 개수를 세어 반환합니다.

  • 'LinkedList_structure' 클래스의 인스턴스를 생성한 후, 요소들이 담긴 리스트를 정의합니다.

  • 리스트를 반복(iteration)하면서 각 요소를 연결 리스트에 순차적으로 추가합니다.

  • 추가된 요소들을 콘솔에 출력하여 확인합니다.

  • 사용자로부터 찾고자 하는 데이터를 입력받은 뒤, 'count_elem' 메서드를 호출하여 발생 횟수를 계산합니다.

  • 최종 결과가 콘솔에 출력됩니다.

시간 복잡도

이 알고리즘은 연결 리스트를 한 번만 순회하므로 시간 복잡도는 O(n)입니다. 여기서 n은 리스트의 노드 개수입니다. 공간 복잡도는 추가 변수만 사용하므로 O(1)입니다.