S5-Week 2 : Data Structure and Algorithm Core (2)
์ปฌ๋ ์ ์๋ฃํ(list, tuple, dict, set..)์ ๋ํด์ ๋ฐฐ์ ๋๋ฐ ์ถ์ ์๋ฃํ์ด๋?
ํ์ด์ฌ์ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด๊ณผ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ํน์ง ๋ชจ๋ ๊ฐ๊ณ ์๋ค.
์ฐ๊ฒฐ
ํ ํํ์ ์๋ฃํ๋ฐฐ์ด : ์์๋ฅผ ์ง์ ์ ๊ทผํ์ฌ ์ ์ฅํ๊ณ ์ธ๋ฑ์ค ํ์ฉ
์ฐ๊ฒฐ๋ฆฌ์คํธ : ๊ฐ ์์๋ ์ฐธ์กฐํ๋ ๋ ธ๋์ ์ ์ฅ๋๋ค
.
>> head.next
ํค๋ ๋
ธ๋๊ฐ next๋ฅผ ์ฐธ์กฐ# linked list ๊ฐ์ฒด ๋ง๋ค๊ธฐ
# linked list์ ๋จ์์ธ ๋
ธ๋ ๊ฐ์ฒด ๋จผ์ ๋ง๋ค๊ธฐ
# ๋
ธ๋์๋ ๊ฐ๊ณผ ๋ค์ ๋
ธ๋๋ก ํฅํ๋ ํฌ์ธํฐ (์ฃผ์) ๊ฐ์ด ์๋ค
class Node:
def __init__(self, value, next=None):
self.value = value
self.next = next # ๋
ธ๋์ ๋ค์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ next์ ์ด๊ธฐ ๊ฐ์ None
# linked list ๊ฐ์ฒด ๋ง๋ค๊ธฐ
# ํค๋์ ๊ฐ์ ์ ์ธํ๋ฉด์ ์์
class linked_list:
def __init__(self, value):
self.head = Node(value)
# ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ ๋ฉ์๋๋ ์๋ต๋๋ค
def add_node(value):
# ์ฒซ๋ฒ์งธ ์์น์ ํด๋นํ๋ head๋ฅผ
# node ๋ณ์์ ์ ์ฅ
node = head
while head.next: # ์ฌ๊ธฐ๊ฐ ์ while์ด๋?
node = head.next
print(head.next)
node.next = Node(value)
head = Node(1)
linked_list.add_node(3)
print(head)
print(head.next)
print(head.value)
print(head.next.value)
>> <__main__.Node object at 0x10b4e3af0>
>> <__main__.Node object at 0x10b4e36a0>
>> 1
>> 3
์ฐ๊ฒฐ
ํ๋ค๋ ๊ฒ์ ๊ณง ์ฐธ์กฐ๋๋ ๋
ธ๋์ ์์น
๋ฅผ ๋ฐ๊พธ๋ ๊ฒ (์ฃผ์)node1 = Node(3)
node2 = Node(4)
node3 = Node(5)
node4 = Node(6)
node1.next = node2 # node2์ ๊ฐ์ node1์ ์ฐธ์กฐํ๋ค
# node1 -> node2
node2.next = node3
node3.next = node4
node = node1 # node ๋ณ์์ node1 ๊ฐ์ผ๋ก ์์ - ํค๋
while node: # node์ ๊ฐ์ด ์๋ค๋ฉด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ญ ๋์๋ผ (๋ฐ๋ณต)
print(node.value)
node = node.next # ๋ง์น while ๋ฌธ์์ p++ ํ๋ ๊ฒ์ฒ๋ผ
# node2 -> node5 -> node3
node5 = Node(7)
node2.next = node5
node5.next = node3
์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๋ฆฌ์คํธ์ ๋ฉ์๋์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ ์ ์๋ค.
class Node:
def __init__(self, value, next=None):
self.value = value
self.next = next
class linked_list:
def __init__(self, value):
self.head = Node(value) # ํค๋๋ฅผ ์์ฑํ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ฑ
# node์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ head -> tail๊น์ง ๋ฐ๋ณต๋ฌธ์ ํตํด ์ ๊ทผํ๋ ๊ฒ
def add_node(self, value):
if self.head == None: # ํค๋๊ฐ ์์ผ๋ฉด
self.head = Node(value) # ํค๋ ์์ฑํด์ค๋ผ (add node ์ญํ )
else : # ์์ํ ํค๋๊ฐ ์๋ค๋ฉด
node = self.head # node ๋ณ์์ ํค๋ ๋ฃ์ด๋๊ณ
while node.next: # ๊ทธ ๋ค์ ๊ฐ์ด ์์ ๋๊น์ง ๊ณ์
node = node.next # node ๋๊น์ง ๋๋ฆฌ๊ธฐ
# tail node๋ก ๋์ฐฉํ๋ค๋ฉด
node.next = Node(value) # ์๋ก์ด tail node ์ถ๊ฐ
def del_node(self, value):
if self.head == None: # ํค๋๊ฐ ์์ผ๋ฉด
print("ํด๋น ๊ฐ์ ๋ํ ๋
ธ๋๋ ์๋ค")
return # ์๋ฌด๊ฒ๋ ๋ฐํ x
elif self.head.value == value : # ํค๋์ value๊ฐ ์ญ์ ํ๊ณ ์ ํ๋ value๋ผ๋ฉด
# ์ฐ์ ๊ฐ์ ์ญ์ ํด์ฃผ๊ธฐ ์ํด temp_node๋ก ๊ฐ ๋ณต์ฌ
temp_node = self.head
# ํค๋ ๋
ธ๋๋ฅผ ํค๋์ ๋ค์ ๋
ธ๋๋ก ๋ณ๊ฒฝ (ํค๋๋ ๋ ์์ํ๋ ๋
ธ๋)
self.head = self.head.next
# ๊ทธ๋ฆฌ๊ณ temp_node๋ ์ญ์
del temp_node
else: # ํค๋๊ฐ ์๋ ๋
ธ๋์ ๊ฐ์ ์ญ์ ํ๋ ๊ฒฝ์ฐ
# ๊ทธ ๋
ธ๋๋ฅผ ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ฐพ๋๋ค
node = self.head
while node.next:
if node.next.value == value:
temp_node = node.next
# node.next ์๋ฆฌ์๋ node.next.next ๋ฃ์ด์ฃผ๊ธฐ
node.next = node.next.next
del temp_node
else:
node = node.next
# ๋
ธ๋ ์ถ๋ ฅ (๋ด๋ฆผ์ฐจ์)
def ord_desc(self):
node = self.head
while node:
print(node.value)
node = node.next
# ์ฐ๊ฒฐ๋ฆฌ์คํธ ๊ฒ์ํจ์
def search_node(self, value):
node = self.head
while node:
if node.value == value:
return node
else:
node = node.next
# ์ฐ๊ฒฐ๋ฆฌ์คํธ์ head์ ์ฃผ์๋ฅผ ํ์ธํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๊ฐ ์กด์ฌํจ์ ํ์ธ
linkedlist.head
>>> <__main__.Node at 0x10aa6ec40>