DOing
[์๋ฃ๊ตฌ์กฐ] ๋ฆฌ์คํธ with Python ๋ณธ๋ฌธ
๐ก Linked List(์ฐ๊ฒฐ๋ฆฌ์คํธ)
๋ฐฐ์ด(array)์ ๋ฏธ๋ฆฌ ๊ณต๊ฐ์ ์์ฝํด๋๊ณ ๊ทธ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ์ฝ๋๋ค.
๋งํฌ๋ ๋ฆฌ์คํธ(linked list)๋ ๋ฏธ๋ฆฌ ์์ฝ์ ํด๋์ง์๊ณ ํ์ํ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ตฌ์กฐ๋ค.
๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ง ์ ์ฅํ์ง๋ง, linked list๋ (๋ฐ์ดํฐ+๋ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฅดํค๋ ์ฃผ์)๋ฅผ ์ ์ฅํ๋ค.
- ๋ ธ๋ : ๋ฐ์ดํฐ ์ ์ฅ๋จ์(๋ฐ์ดํฐ๊ฐ, ํฌ์ธํฐ)๋ก ๊ตฌ์ฑ
- ํฌ์ธํฐ : ๊ฐ ๋ ธ๋์์์ ๋ค์์ด๋ ์ด์ ๋ฐ์ดํฐ์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ณต๊ฐ
๐ก ๋งํฌ๋๋ฆฌ์คํธ ์ฅ๋จ์
์ฅ์ :
1) ๋ฏธ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ์ง์์๋๋๋ค.
2) ์ฐ์๋ ๊ณต๊ฐ์ ํ ๋นํ ํ์๋ ์๋ค.
๋จ์ :
1) ์ ์ฅ๊ณต๊ฐ์ ํจ์จ์ด ๋์ง์๋ค.
-> ๋ฐ์ดํฐ ๋ฟ๋ง์๋๋ผ ์ฃผ์๋ฅผ ์ํ ๊ณต๊ฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
2) ์ ๊ทผ ์๋๊ฐ ๋๋ฆฌ๋ค.
-> ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ํตํด ๋น ๋ฅด๊ฒ ์ ๊ทผํ์ง๋ง, Linked list๋ ์ฐ๊ฒฐ์ ๋ณด๋ฅผ ์ฐพ๋ ์๊ฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
3) ์ค๊ฐ ๋ฐ์ดํฐ ์ญ์ ์ ์ ๋ค ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ์ ์ฌ๊ตฌ์ฑํ๋ ๋ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ๋ค.
๐ก Array VS List
์ถ๊ฐ / ์ญ์ | ์กฐํ | |
Array | ๋๋ฆผ | ๋น ๋ฆ |
List | ๋น ๋ฆ | ๋๋ฆผ |
- ๋ฐฐ์ด : ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ ํด์ ธ ์๊ณ , ์ถ๊ฐ์ ์ธ ์ฝ์ ์ญ์ ๊ฐ ์ผ์ด ๋์ง ์์ผ๋ฉฐ ๊ฒ์์ ํ์๋ก ํ ๋ ์ ๋ฆฌ.
- ๋ฆฌ์คํธ : ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ ํด์ ธ ์์ง ์๊ณ , ์ฝ์
์ญ์ ๊ฐ ๋ง์ด ์ผ์ด๋๋ฉฐ, ๊ฒ์์ด ์ ์ ๊ฒฝ์ฐ ์ ๋ฆฌ.
๐ก ๋งํฌ๋๋ฆฌ์คํธ ๊ตฌํ ์ฝ๋
class Node:
def __init__(self, data, next=None):
self.data = data
self.next = next
class NodeMgmt:
def __init__(self, data):
self.head = Node(data) # ๋งจ์ ๋
ธ๋ ์์ฑ
# ๋งจ๋์ ๋
ธ๋ ์ถ๊ฐ
def add(self, data):
if self.head=='': # ๋ฐฉ์ด ์ฝ๋
self.head = Node(data)
else :
node = self.head
while node.next:
node = node.next
node.next = Node(data)
# ์ ์ฒด ๋ฐ์ดํฐ ์ถ๋ ฅ
def desc(self) :
node = self.head
while node:
print(node.data, end=' ')
node=node.next
def delete(self, data):
# ์๋ฌด๋ฐ ๋
ธ๋๊ฐ ์๋ค.
if self.head =='':
print("๋
ธ๋๊ฐ ์์ต๋๋ค.")
return
# head ๋ฐ์ดํฐ ์ญ์
if self.head.data == data:
temp = self.head
self.head = self.head.next
del temp
else:
node = self.head
while node.next:
if node.next.data == data:
temp = node.next
node.next = node.next.next #๋ง์ง๋ง ๋
ธ๋์๋ค๋ฉด null
del temp
else:
node=node.next
#์คํ
linkedlist1 = NodeMgmt(0)
linkedlist1.desc() #0
print()
for data in range(1,10):
linkedlist1.add(data)
linkedlist1.desc() #0~9๊น์ง ์ถ๋ ฅ
print()
linkedlist1.delete(4)
linkedlist1.desc()#0 1 2 3 5 6 7 8 9
๐ก Double Linked List
๋ด๊ฐ ์ํ๋ ๋ฐ์ดํฐ๊ฐ ํ๋ฐ์ ์๋ค๋ฉด ๋ฌด์กฐ๊ฑด ์์์๋ถํฐ ๊ฒ์์ ํ๋ Linked list๋ ์ค๋๊ฑธ๋ฆด ์ ์๋ค.
์ด๋ฅผ ๋ณด์ํ double linked list๋ ๊ตฌ์กฐ๊ฐ ๋ค์๊ณผ ๊ฐ๋ค.
๐ก ๋๋ธ ๋งํฌ๋๋ฆฌ์คํธ ๊ตฌํ ์ฝ๋
class Node:
def __init__(self, data, prev=None, next=None):
self.prev = prev
self.data = data
self.next = next
class NodeMgmt:
def __init__(self, data):
self.head = Node(data)
self.tail = self.head #์ฒ์์๋ ๋
ธ๋๊ฐ ํ๋๋ผ์ head=tail
def insert(self, data):
if self.head == None: # ๋ฐฉ์ด์ฝ๋
self.head = Node(data)
self.tail = self.head
else:
node = self.head
while node.next:
node = node.next
new = Node(data)
node.next = new
new.prev = node
self.tail = new
def desc(self):
node = self.head
while node:
print(node.data, end=' ')
node=node.next
# head๋ถํฐ ๊ฒ์ํ๋ ์ฝ๋
def search_from_head(self, data):
if self.head == None: #๋ฐฉ์ด์ฝ๋
return False
node = self.head
while node:
if node.data == data:
return node
else:
node = node.next
return False
# tail๋ถํฐ ๊ฒ์ํ๋ ์ฝ๋
def search_from_tail(self, data):
if self.head == None:
return False
node = self.tail
while node:
if node.data == data:
return node
else:
node = node.prev
return False
# ํน์ ์ซ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ํจ์
def insert_before(self, data, before_data):
if self.head == None: # ์์ ์๋ค๋ฉด
return False
else:
node = self.tail
while node.data != before_data:
node = node.prev
if node == None:
return False
new = Node(data)
before_new = node.prev
new.next = node
new.prev = before_new
node.prev = new
before_new.next = new
return True
# 0~9๊น์ง ๋ฃ๊ธฐ
double_linked_list = NodeMgmt(0)
for data in range(1,10):
double_linked_list.insert(data)
double_linked_list.desc()
print()
# ๋ฐ์ดํฐ 2์์ 1.5๋ฃ๊ธฐ
double_linked_list.insert_before(1.5, 2)
double_linked_list.desc()
print()
# ๊ฒ์
search = double_linked_list.search_from_tail(1.5)
print(search.data)
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] ์ฐ์ ์์ ํ, ํ (0) | 2021.05.19 |
---|---|
[์๋ฃ๊ตฌ์กฐ] ํธ๋ฆฌ with Python (0) | 2021.05.18 |
[์๋ฃ๊ตฌ์กฐ] ํด์ฌ ํ ์ด๋ธ with Python (0) | 2021.05.18 |
์๊ฐ ๋ณต์ก๋ - ๋น ์คํ๊ธฐ๋ฒ (0) | 2021.05.18 |
[์๋ฃ๊ตฌ์กฐ] ๋ฐฐ์ด with Python (0) | 2021.05.18 |