반응형
이전에 만들었던 코드에 이어서 이번에는 추가 연산을 하는 기능을 추가해보겠습니다.
추가 연산은 두 가지 경우의 수가 있음을 유추해볼 수 있습니다.
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__이 동작합니다.
추가 연산을 간단하게 표현할 수 있습니다. 궁금하신 점은 댓글로 남겨주시면 답변드리겠습니다!
반응형
'프로그래밍 > 자료구조' 카테고리의 다른 글
파이썬으로 이중연결리스트를 만들어보자! (추가 연산, 탐색 연산) (0) | 2023.01.29 |
---|---|
단순연결리스트로 스택 구현하기(Stack 자료구조, FILO : first in Last out) (2) | 2023.01.29 |
파이썬으로 연결리스트 만들기 4탄 : 단순 연결리스트 삭제연산 (맨 앞 노드 삭제 / 맨 뒤 노드 삭제 / 중간 노드 삭제 방법) (0) | 2023.01.01 |
파이썬으로 연결리스트 만들기 3탄 : 단순 연결리스트 삽입 연산(원하는 곳에 삽입하자! / 맨 뒤에 삽입 / 맨 앞에 삽입 / 중간에 삽입) (0) | 2022.12.06 |
파이썬으로 연결리스트 만들기 1탄(자료구조 / 단순 연결리스트 / 이중 연결리스트 / 추가 / 삽입 / 삭제 / 접근) (0) | 2022.12.04 |
댓글