본문 바로가기
프로그래밍/자료구조

파이썬으로 연결리스트 만들기 2탄 : 단순 연결리스트 추가 연산 (연결리스트 자동 출력 만들기)

by 인성패밀리 2022. 12. 4.
반응형

이전에 만들었던 코드에 이어서 이번에는 추가 연산을 하는 기능을 추가해보겠습니다.

 

추가 연산은 두 가지 경우의 수가 있음을 유추해볼 수 있습니다.

1. 이미 있는 연결리스트의 뒤에 추가하는 경우

2. 연결리스트가 비어있을 때 추가하는 경우

이미 있는 연결리스트의 뒤에 추가하는 경우
비어있는 연결리스트에 추가하는 방법

이미 있는 연결리스트 뒤에 추가하는 경우 동작 과정입니다.

1) 새 노드를 생성한다.

2) tail node의 다음이 새 노드를 가리킨다.

3) 새 노드는 tail node가 된다.

 

비어있는 연결리스트에 추가하는 경우 동작 과정입니다.

1) 새 노드를 생성한다.

2) 새 노드가 head node가 된다.

3) 새노드가 tail node가 된다.

 

그렇다면 연결리스트가 비어있는지 있는지 판단해야합니다. 이는 조건문으로 해결해야합니다. head 노드가 비어있다면 그 연결리스트는 비어있다고 판단할 수 있으며 인스턴스 변수인 count가 0일 때도 그 연결리스트는 비어있다고 판단할 수 있습니다.

 

따라서 다음과 같이 코드를 작성할 수 있습니다.

class Node:
    def __init__(self, data):
        self.data = data  # 노드의 값
        self.next = None  # 다음 노드를 가리키는 정보


class LinkedList:
    def __init__(self):
        """연결리스트를 처음 생성 시 아무것도 없으므로 다음과 같이 초기화 할 수 있다"""
        self.head = None
        self.tail = None
        self.count = 0

    def append(self, value):
        """연결리스트 뒤에 추가하는 메소드"""
        new_node = Node(value)  # 공통 특징은 우선 새 노드를 생성한다는 것

        if self.count == 0:  # 연결리스트가 비었을 때
            self.head = new_node  # 새 노드가 head node가 된다.
            self.tail = new_node  # 새 노드가 tail node가 된다.
        else:  # 연결리스트가 안 비어있을 때
            self.tail.next = new_node  # tail node의 다음이 새 노드를 가리킨다
            self.tail = new_node  # 새 노드는 tail node가 된다
        self.count += 1  # 노드가 추가 되었으니까 갯수를 하나 올린다.

# 테스트 코드
s = LinkedList()
s.append(1)
s.append(2)
s.append(3)

print(s.head.data)  # 1 출력
print(s.head.next.data)  # 2 출력
print(s.head.next.next.data)  # 3 출력

 

일일이 확인하기 귀찮으니까 바로 출력을 해주는 메소드를 하나 만들어주겠습니다. __str__메소드를 이용하면 편리하게 사용이 가능합니다.

class Node:
    def __init__(self, data):
        self.data = data  # 노드의 값
        self.next = None  # 다음 노드를 가리키는 정보


class LinkedList:
    def __init__(self):
        # 연결리스트를 처음 생성 시 아무것도 없으므로 다음과 같이 초기화 할 수 있다.
        self.head = None
        self.tail = None
        self.count = 0

    def append(self, value):
        """연결리스트 뒤에 추가하는 메소드"""
        new_node = Node(value)  # 공통 특징은 우선 새 노드를 생성한다는 것

        if self.count == 0:  # 연결리스트가 비었을 때
            self.head = new_node  # 새 노드가 head node가 된다.
            self.tail = new_node  # 새 노드가 tail node가 된다.
        else:  # 연결리스트가 안 비어있을 때
            self.tail.next = new_node  # tail node의 다음이 새 노드를 가리킨다
            self.tail = new_node  # 새 노드는 tail node가 된다
        self.count += 1  # 노드가 추가 되었으니까 갯수를 하나 올린다.

    def __str__(self):
        """자동으로 출력해주는 메소드 사용법은 인스턴스를 출력시키면됩니다."""
        i = self.head
        result = ""
        while True:
            if i.next is None:
                result += str(i.data)
                break
            else:
                result += str(i.data) + " -> "
            i = i.next
        return result


# 테스트 코드
s = LinkedList()
s.append(1)
s.append(2)
s.append(3)

print(s)  # 생성한 인스턴스를 출력하면 __str__이 동작합니다.

 

추가 연산을 간단하게 표현할 수 있습니다. 궁금하신 점은 댓글로 남겨주시면 답변드리겠습니다!

반응형

댓글