Programming/자료구조
[파이썬] Linked list
Hard_Try
2020. 4. 1. 20:58
1. 데이터를 순서대로 저장해준다.
2. 요소를 계속 추가할 수 있다.
쉽게 비유하면 이렇다.
이런식으로 숫자를 작은 수 부터 나열하고 싶을 때 규리가 2를 가지고있으면 가지고 있는 뒤 테이블에 다음으로 작은 숫자를 가진 이름을 넣어두면 일렬로 정렬되는 것이다.
이렇게 연결된 박스들의 순서는 규리 - 태호 - 동욱 - 유나 - 현승 순으로 연결된다.
🤔 노드(Node)
data는 가지고 있는 변수와 같은 요소값이 들어가고 next에는 다음 노드의 레퍼런스가 들어간다.
가장 첫번째 노드의 주소를 알면 흩어져 있는 노드들을 가져올 수 있다.
가장 첫번째의 노드를 Head 노드라고 한다. 실제 메모리에는 여기저기 흩어져 있다는 것을 인지하자.
🤔 노드 클래스 만들기
class Node:
"""링크드 리스트의 노드 클래스"""
def __init__(self, data):
self.data = data # 노드가 저장하는 데이터
self.next = None # 다음 노드에 대한 레퍼런스
# 데이터 2, 3, 5, 7, 11을 담는 노드들 생성
head_node = Node(2)
node_1 = Node(3)
node_2 = Node(5)
node_3 = Node(7)
tail_node = Node(11)
# 노드들을 연결
head_node.next = node_1
node_1.next = node_2
node_2.next = node_3
node_3.next = tail_node
#노드 순서대로 출력
iterator = head_node
while iterator is not None:
print(iterator.data)
iterator = iterator.next
🤔 링크드 리스트 만들기
class Node:
"""링크드 리스트의 노드 클래스"""
def __init__(self, data):
self.data = data # 노드가 저장하는 데이터
self.next = None # 다음 노드에 대한 레퍼런스
class LinkedList:
"""링크드 리스트 클래스"""
def __init__(self):
self.head = None
self.tail = None
def append(self, data):
"""링크드 리스트 추가 연산 메소드"""
new_node = Node(data)
if self.head is None: # 링크드 리스트가 비어 있는 경우
self.head = new_node
self.tail = new_node
else: # 링크드 리스트가 비어 있지 않은 경우
self.tail.next = new_node
self.tail = new_node
# 새로운 링크드 리스트 생성
my_list = LinkedList()
# 링크드 리스트에 데이터 추가
my_list.append(2)
my_list.append(3)
my_list.append(5)
my_list.append(7)
my_list.append(11)
iterator = my_list.head
while iterator is not None:
print(iterator.data)
iterator = iterator.next
🤔 링크드 리스트 __str__ 메소드
class Node:
"""링크드 리스트의 노드 클래스"""
def __init__(self, data):
self.data = data # 노드가 저장하는 데이터
self.next = None # 다음 노드에 대한 레퍼런스
class LinkedList:
"""링크드 리스트 클래스"""
def __init__(self):
self.head = None # 링크드 리스트의 가장 앞 노드
self.tail = None # 링크드 리스트의 가장 뒤 노드
def append(self, data):
"""링크드 리스트 추가 연산 메소드"""
new_node = Node(data)
# 링크드 리스트가 비어 있으면 새로운 노드가 링크드 리스트의 처음이자 마지막 노드다
if self.head is None:
self.head = new_node
self.tail = new_node
# 링크드 리스트가 비어 있지 않으면
else:
self.tail.next = new_node # 가장 마지막 노드 뒤에 새로운 노드를 추가하고
self.tail = new_node # 마지막 노드를 추가한 노드로 바꿔준다
def __str__(self):
"""링크드 리스트를 문자열로 표현해서 리턴하는 메소드"""
res_str = "|"
# 링크드 리스트 안에 모든 노드를 돌기 위한 변수. 일단 가장 앞 노드로 정의한다.
iterator = self.head
# 링크드 리스트 끝까지 돈다
while iterator is not None:
# 각 노드의 데이터를 리턴하는 문자열에 더해준다
res_str += f" {iterator.data} |"
iterator = iterator.next # 다음 노드로 넘어간다
return res_str
# 새로운 링크드 리스트 생성
linkedList = LinkedList()
# 링크드 리스트에 데이터 추가
linkedList.append(2)
linkedList.append(3)
linkedList.append(5)
linkedList.append(7)
linkedList.append(11)
print(linkedList)
여기서 쓰인 f string은
name = "cat" / age = 13 / address = "Korea" 가 초기화 되어 있을 때
f"{name}은 {age}살이고 {address}에 있음" 이라고 변수에 저장후 출력시
cat은 13살이고 Korea에 있음으로 출력됨. 굉장히 편리하지만 파이썬 3.6 버전부터 쓸 수 있다.
| 2 | 3 | 5 | 7 | 11 |