0
부터 시작하며 이를 index
라고 함중간에 삽입/삭제
하려면 모든 원소
를 다 옮겨야 함중간에 삽입/삭제
하기 위해서 앞 뒤의 연결 고리(포인터)만 변경하면 됨경우 | Array | LinkedList |
---|---|---|
특정 원소 조회 | O(1) | O(N) |
중간에 삽입 삭제 | O(N) | O(1) |
데이터 추가 | 데이터 추가 시 모든 공간이 다 차버렸다면 새로운 메모리 공간을 할당 받아야 함 | 모든 공간이 다 찼어도 맨 뒤의 노드만 동적으로 추가하면 된다. |
정리 | 데이터에 접근하는 경우가 빈번하다면 Array를 사용하자 | 삽입과 삭제가 빈번하다면 LinkedList를 사용하는 것이 더 좋다. |
[]
은 List인가 Array인가class 변수1:
내용
변수2 = 변수1()
__init__
으로 고정self
는 객체 자기 자신을 가리킴. 따라서 파라미터를 따로 넣을 필요 없이 그냥 호출 하면 됨class Person:
def __init__(self):
print("hello", self)
person_1 = Person() # hello <__main__.Person object at 0x7fa868038760>
self
를 사용하면 객체에 데이터를 쌓을 수 있음self.name
에 param_name
을 저장하겠다는 건, 그 객체의 name
이라는 변수에 저장된다는 의미class Person:
def __init__(self, param_name):
print("hello", self)
self.name = param_name
person_1 = Person("solrasido") # hello <__main__.Person object at 0x7fe600190760>
print(person_1.name) # solrasido
Person
이라는 클래스에 함수 추가메소드(Method)
라고 한다.class Person:
def __init__(self, param_name):
print("hello", self)
self.name = param_name
# talk라는 함수 추가 (클래스 내부에 있는 함수이므로 '메소드'라고 한다.)
def talk(self):
print('안녕하세요, 저는', self.name, "입니다.")
person_1 = Person("solrasido") # hello <__main__.Person object at 0x7fe600190760>
print(person_1.name) # solrasido
person_1.talk() # 안녕하세요, 저는 solrasido 입니다.
train_compartments = ["기관실"] -> ["시멘트"] -> ["자갈"] -> ["밀가루"] -> ["우편"]
클래스
를 이용함data
를 인자로 받아서 self.data
에 저장self.next
에는 None
을 저장class Node:
def __init__(self, data): # 클래스 생성 생성자에 data를 넣음
self.data = data # data를 self.data에 저장
self.next = None # 다음 노드가 없기 때문에 self.next에 None을 저장
node = Node(3) # 현재는 next가 없어 하나의 노드만 존재
print(node) # <__main__.Node object at 0x7fde90190760>
print(node.data) # 3
class Node:
def __init__(self, data): # 클래스 생성 생성자에 data를 넣음
self.data = data # data를 self.data에 저장
self.next = None # 다음 노드가 없기 때문에 self.next에 None을 저장
first_node = Node(5) # 현재 next 가 없이 하나의 노드만 있음 [5]
second_node = Node(12) # [12]를 들고 있는 노드 생성
first_node.next = second_node # [5]의 next를 [12]로 지정 [5] -> [12]
print(first_node.data) # 5
print(second_node.data) # 12
print(first_node.next.data) # 12
head node
만 들고 있음맨 앞 칸
만 저장해둠next
를 통해 다음 노드 접근self.head
에 시작하는 노드 저장next
를 조회해서 찾아가야 함class Node:
def __init__(self, data): # 클래스 생성 생성자에 data를 넣음
self.data = data # data를 self.data에 저장
self.next = None # 다음 노드가 없기 때문에 self.next에 None을 저장
class LinkedList:
def __init__(self, value):
self.head = Node(value) # head에 클래스 Node 연결
linked_list = LinkedList(5) # 현재 링크드 리스트에는 5만 존재
print(linked_list.head.data) # 5가 출력된다
append
함수 만들기가장 맨 뒤의 노드까지
가야함cur
head
[3] -> [5] -> [6] -> [8]
# head를 따라서 이동
# head는 변경이 불가하여, 'cur'이라는 변수 이용
{cur = this.head}
cur
[3] -> [5] -> [6] -> [8]
{cur = cur.next}
cur
[3] -> [5] -> [6] -> [8]
{cur = cur.next}
cur
[3] -> [5] -> [6] -> [8]
# 맨 뒤의 노드까지 라는 것은 cur.next가 None이라는 것
# 맨 마지막 노드는 다음 노드가 없어 아무것도 가리키지 않음
class Node:
def __init__(self, data): # 클래스 생성 생성자에 data를 넣음
self.data = data # data를 self.data에 저장
self.next = None # 다음 노드가 없기 때문에 self.next에 None을 저장
class LinkedList:
def __init__(self, value):
self.head = Node(value) # head에 클래스 Node 연결
def append(self, value): # LinkedList 가장 끝에 있는 노드에 새로운 노드 연결
cur = self.head
while cur.next is not None: # cur의 다음이 끝에 갈 때 까지 이동
cur = cur.next
cur.next = Node(value)
def print_all(self):
cur = self.head # head에 저장되어있는 노드를 cur 이라는 변수에 담고
while cur is not None: # cur의 다음이 끝에 갈 때 까지 출력. (None이 아닐 때까지)
print(cur.data)
cur = cur.next
linked_list = LinkedList(5) # 5
linked_list.append(12) # 5 -> 12
linked_list.append(8) # 5 -> 12 -> 8
linked_list.print_all()
class Node:
def __init__(self, data): # 클래스 생성 생성자에 data를 넣음
self.data = data # data를 self.data에 저장
self.next = None # 다음 노드가 없기 때문에 self.next에 None을 저장
class LinkedList:
def __init__(self, value):
self.head = Node(value) # head에 클래스 Node 연결
def append(self, value): # LinkedList 가장 끝에 있는 노드에 새로운 노드 연결
cur = self.head
while cur.next is not None: # cur의 다음이 끝에 갈 때 까지 이동
cur = cur.next
cur.next = Node(value)
def print_all(self):
cur = self.head # head에 저장되어있는 노드를 cur 이라는 변수에 담고
while cur is not None: # cur의 다음이 끝에 갈 때 까지 출력. (None이 아닐 때까지)
print(cur.data)
cur = cur.next
def get_node(self, index):
node = self.head # head에 저장되어 있는 노드를 node라는 변숭레 담고
count = 0 # count라는 인덱스를 저장하기 위한 변수를 저장 초기값 0
while count < index: # count가 index가 될 때까지 (이 때 while 문 내부에서 1씩 더해주니까 작을떄까지로 조건을 넣는다)
node = node.next # node의 next 값을 node에 대입하고
count += 1 # count를 증가 (count가 index가 아닐 때까지 반복)
return node # node 반환
linked_list = LinkedList(5) # 5
linked_list.append(12) # 5 -> 12
linked_list.append(8) # 5 -> 12 -> 8
linked_list.print_all()
print(linked_list.get_node(0).data) # 인덱스 0 의 원소 5 출력