๐Linked List (์ฐ๊ฒฐ ๋ฆฌ์คํธ)
- linked list๋ ๋จ์ด์ง ๊ณณ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ค์ ํฌ์ธํฐ๋ก '์ฐ๊ฒฐ'ํด์ ๊ด๋ฆฌํ๋ data structure
- ์ฅ์ (๋ฐฐ์ด์ ๋จ์ ๊ทน๋ณต): ๋น์ฐ์์ ๋ฐ์ดํฐ๋ฅผ ํฌ์ธํฐ๋ก ์ฐ๊ฒฐํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ ๋น๋ฐ์ ํ์๊ฐ ์์
๋ฐฐ์ด์ ์ฐ์์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋์ดํ๊ธฐ ๋๋ฌธ์ ํน์ ํ ์ฐ๊ฒฐ๋ ๊ณต๊ฐ์ ๋ฏธ๋ฆฌ ํ ๋น๋ฐ์์ผ ํจ - ๋จ์ : ๊ฐ ๋ฐ์ดํฐ๋ง๋ค ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฃผ์(ํฌ์ธํฐ)๋ ๊ฐ์ด ์ ์ฅํด์ผํ๋ฏ๋ก ์ ์ฅ๊ณต๊ฐ ํจ์จโ
์ฒซ ๋ ธ๋(head)๋ถํฐ ์ญ์ฐ์ฐ-์ฑ ๊ฒ์ํด์ผ ํด์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ฐพ๋ ์๊ฐ์ด ํ์ํ์ฌ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋๋ฐ์ ์๊ฐ์ด ์์ (๋ฐฐ์ด์ index๋ก ๋ฐ๋ก ์ ๊ทผ ๊ฐ๋ฅ)
์ค๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ/์ญ์ ํ ๋, ์ถ๊ฐ์ ์์ ์ด ํ์
๐์ผ๋ฐ(๊ฐ๋จํ) linked list
1) node ๊ตฌํ
python class๋ฅผ ์ด์ฉํ์ฌ linked list node ๊ตฌํ
class Node:
def **init**(self, data):
self.data = data
self.next = None
__init__
ํจ์๋ก ํด๋์ค๊ฐ ๊ฐ์ฒดํ ๋ ๋๋ง๋ค ๊ฐ์ฒด์ data์ next๋ฅผ initialize
๊ฐ์ฒดํ ๋ ๋๋ง๋ค next๋ None์ผ๋ก ์ ์ธ
def **init**(self, data, next=None):
self.data = data
self.next = next
instance๋ฅผ ์์ฑํ ๋๋ง๋ค parameter๋ฅผ 2๊ฐ ๋ฃ์ ์ ์์ผ๋ฉฐ, ๋ฐ๋ก next๋ฅผ ์ค์ ๊ฐ๋ฅ(next ๊ฐ ์ ์ธํ์ง ์์ผ๋ฉด default๊ฐ์ None๊ฐ์ผ๋ก)
2) node์ node ์ฐ๊ฒฐ(pointer)
node2 = Node(2) #node2.data = 2, node2.next = None
node1.next = node2
head = node1
3) ๋ฐ์ดํฐ ์ถ๊ฐํ๊ธฐ
def **init**(self, data, next=None):
self.data = data
self.next = next
def add(data):
node = head #ํค๋ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ(node = head = node1 = Node(1))
while node.next: #๋ค์ ๋
ธ๋๊ฐ ์์ผ๋ฉด(node.next๊ฐ ์์ผ๋ฉด)
node = node.next #๋ค์ ๋
ธ๋๋ก ์ด๋ (๋ง์ง๋ง ๋
ธ๋๊น์ง ํ๊ธฐ)
node.next = Node(data) #๋ง์ง๋ง ๋
ธ๋์ next์ ์๋ก์ด ๋
ธ๋ ํ ๋น
- ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ํจ์ add() ์ ์
- while๋ฌธ์ ๋ค์ ๋
ธ๋๊ฐ ์กด์ฌํ ๋๊น์ง ๋ฐ๋ณต
node๋ฅผ ๊ณ์ ๋ค์ node๋ก ์ฎ๊ฒจ๊ฐ๋ฉฐ ๊ฒฐ๊ตญ ๊ฐ์ฅ ๋ง์ง๋ง node๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต - ๋ง์ง๋ง ๋ ธ๋๋ฅผ ์ฐพ์ผ๋ฉด ๊ทธ ๋ง์ง๋ง ๋ ธ๋์ ๋ค์ ์ฃผ์๋ฅผ ์๋กญ๊ฒ ์ถ๊ฐํ๊ณ ์ ํ๋ ๊ฐ์ฒด Node(data)๋ก ํ ๋น
head = node1
for index in range(2, 10):
add(index)
1๋ถํฐ 9๊น์ง ์ฐ๊ฒฐ๋ linked list ์์ฑ
4) ๋ฐ์ดํฐ ์ถ๋ ฅํ๊ธฐ (search)
node = head
while node.next:
print(node.data)
node = node.next #๋ค์ ๋
ธ๋ ํ๊ธฐ
print (node.data) #node.next๊ฐ ์๋ ๊ฐ์ฅ ๋ง์ง๋ง node๊น์ง ์ถ๋ ฅ ์๋ฃ
๐ํ์ด์ฌ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก linked list ๊ตฌํ
๊ตฌํํ class: Node, NodeMgmt
๊ตฌํํ function(method): add, desc, delete, search_node
1) node์ node ์ฌ์ด์ ์๋ก์ด node ์ถ๊ฐ
(์ถ์ฒ: wikipedia, https://en.wikipedia.org/wiki/Linked_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: #while๋ฌธ์ ์ ์ผ ๋ง์ง๋ง node๋ฅผ ํ๊ธฐ ์ํจ
node = node.next
node.next = Node(data)
def desc(self):
node = self.head
while node: #node๊ฐ ์์ผ๋ฉด
print (node.data)
node = node.next #๋ค์ node ํ๊ธฐ
- NodeMgmt class์์๋
__init__
ํจ์์์ NodeMgmt(data)๋ฅผ ๊ฐ์ฒดํํ์ฌ instance๋ฅผ ์์ฑํ๋ฉด Node(data)๊ฐ head๋ก ๊ฐ์ด ์์ฑ๋จ
(๋งจ ์ ๋ ธ๋(head node)์ ์ฃผ์๋ฅผ ์๊ณ ์์ด์ผ ์ ์ฒด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ ์ด ๊ฐ๋ฅ(์ถ๊ฐ/์ญ์ /๊ฒ์)) - add(): ๋งจ ๋์ ๋ ธ๋คใน ์ถ๊ฐํ๋ ํจ์
- desc(): ์ ์ฒด linked list์ ๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ ํจ์
```
linkedlist1 = NodeMgmt(0)
print(linkedlist1.desc()) #0
```
๊ฐ์ฒด ์์ฑ => data = 0, next = None, head = linkedlist1
for data in range(1, 10):
linkedlist1.add(data)
print(linkedlist1.desc()) #0, 1, 2, 3, 4, 5, 6, 7, 8, 9
2) ํน์ ๋ ธ๋ ์ญ์ (head node / tail node / middle node ์ญ์ )
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)
node = node.next
def delete(self, data):
if self.head == '': #๋ฐฉ์ด ์ฝ๋: head๊ฐ ์์ ์์ ๋
print ("ํด๋น ๊ฐ์ ๊ฐ์ง ๋
ธ๋๊ฐ ์์ต๋๋ค.")
return
if self.head.data == data: #head node๋ฅผ ์ญ์ ํ ๋
temp = self.head
self.head = self.head.next #head ๋ณ๊ฒฝ
del temp
else: # middle/tail node๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ
node = self.head
while node.next:
if node.next.data == data: # if-else๋ฌธ์ ๋ด๊ฐ ์ญ์ ํ๊ณ ์ ํ๋ ๊ฐ์ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต
temp = node.next
node.next = node.next.next
del temp
return
else: #๋ด๊ฐ ์ฐพ๋ ๊ฐ์ด ์๋๋ฉด ๋ค์ ๋
ธ๋ ํ๊ธฐ
node = node.next
- delete(): ํน์ data๋ฅผ ๊ฐ์ง ๋ ธ๋๋ฅผ ์ญ์ ํ๋ ํจ์
- head node๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ์ ์ค๊ฐ/tail node๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ถ๋ฆฌ
3) ๋ ธ๋ ๋ฐ์ดํฐ๊ฐ ํน์ ์ซ์์ธ ๋ ธ๋๋ฅผ search
class Node:
def **init**(self, data):
self.data = data
self.next = None
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)
node = node.next
def delete(self, data):
if self.head == '':
print ('ํด๋น ๊ฐ์ ๊ฐ์ง ๋
ธ๋๊ฐ ์์ต๋๋ค.')
return
if self.head.data == data: # ๊ฒฝ์ฐ์ ์1: self.head๋ฅผ ์ญ์ ํด์ผํ ๊ฒฝ์ฐ - self.head๋ฅผ ๋ฐ๊ฟ์ค์ผ ํจ
temp = self.head # self.head ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๊ธฐ ์ํด, ์์๋ก temp์ ๋ด์์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ์
self.head = self.head.next # ๋ง์ฝ self.head ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ฉด, ์ด ์ฝ๋๊ฐ ์คํ์ด ์๋๊ธฐ ๋๋ฌธ!
del temp
else:
node = self.head
while node.next: # ๊ฒฝ์ฐ์ ์2: self.head๊ฐ ์๋ ๋
ธ๋๋ฅผ ์ญ์ ํด์ผํ ๊ฒฝ์ฐ
if node.next.data == data:
temp = node.next
node.next = node.next.next
del temp
pass
else:
node = node.next
def search_node(self, data):
node = self.head
while node:
if node.data == data:
return node
else:
node = node.next
- search_node(): ํน์ ๊ฐ์ ๊ฐ์ง node๋ฅผ searchํ๋ ํจ์
# test
node\_mgmt = NodeMgmt(0)
for data in range(1, 10):
node\_mgmt.add(data)
node = node\_mgmt.search\_node(4)
print (node.data)
๐Doubly Linked List
(์ถ์ฒ: wikipedia, https://en.wikipedia.org/wiki/Linked_list)
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ์๋ฐฉํฅ ์ฐ๊ฒฐ -> ์์ชฝ์ผ๋ก ๋
ธ๋ ํ์์ด ๊ฐ๋ฅํ์ฌ ๋ ํจ์จ์ ์ผ๋ก ํ์ ๊ฐ๋ฅ
(single linked list๋ผ๋ฉด head๋ถํฐ ํ ๋ฐฉํฅ์ผ๋ก ์ฐพ์๊ฐ์ผ ํ์ง๋ง, ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ๋๋ต์ ์ธ ์์น๋ฅผ ์๋ค๋ฉด head์ tail ์์ชฝ์์ ๋ชจ๋ ํ์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ !)
1) doubly linked list ๊ตฌํ
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
def insert(self, data):
if self.head == None:
self.head = Node(data)
self.tail = self.head #์ฒ์์๋ node๊ฐ 1๊ฐ๋๊น head๋ tail์ด๋ ๋๊ฐ์
else:
node = self.head
while node.next:
node = node.next
new = Node(data) #insertํ ๋
ธ๋๋ฅผ new๋ผ๋ ๋ณ์์ ํ ๋น
node.next = new
new.prev = node
self.tail = new #insertํ ๋
ธ๋๊ฐ tail
def desc(self):
node = self.head
while node:
print (node.data)
node = node.next
- Node instance๋ ์ด์ ๋ ธ๋ ์ฃผ์(prev)์ ๋ค์ ๋ ธ๋ ์ฃผ์(next)๋ฅผ ๊ฐ์ง๊ณ ์์
- insert(): ๊ฐ์ฅ ๋์ node๋ฅผ ์ถ๊ฐํ๋ ํจ์
node.next = new
,new.prev = node
๊ฐ ํต์ฌ!!: ์๋ ๋ ธ๋๋ ๋ค์ ๋ ธ๋๋ ์๋ก์ฐ ใด๋ ธ๋๋ฅผ, ์๋ก์ด ๋ ธ๋์ ์ด์ ๋ ธ๋๋ ์๋ ๋ ธ๋๋ฅผ
#test
double\_linked\_list = NodeMgmt(0)
for data in range(1, 10):
double\_linked\_list.insert(data)
double\_linked\_list.desc()
2) ํน์ ๋ ธ๋ search (head๋ถํฐ / tail๋ถํฐ)
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
def insert(self, data):
if self.head == None:
self.head = Node(data)
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)
node = node.next
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 #์ฌ๊ธฐ๊น์ง ์๋ค๋ ๊ฑด ์ฐพ๊ณ ์ํ๋ ๊ฐ์ ๋ชป์ฐพ์๋ค๋ ๊ฑฐ
def search_from_tail(self, data):
if self.head == None:
return False
node = self.tail #tail์์ ๋ถํฐ search
while node:
if node.data == data:
return node
else:
node = node.prev
return False
- search_from_head(): head๋ถํฐ searchํ๋ ํจ์
- search_from_tail(): tail๋ถํฐ searchํ๋ ํจ์
3) ๋ ธ๋ ๋ฐ์ดํฐ๊ฐ ํน์ ์ซ์์ธ ๋ ธ๋ ์ / ๋ค์ ๋ฐ์ดํฐ ์ถ๊ฐ
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
def insert(self, data):
if self.head == None:
self.head = Node(data)
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)
node = node.next
def insert_before(self, data, before_data):
if self.head == None: #๋ฐฉ์ด์ฝ๋: head node๊ฐ ์์ผ๋ฉด ๋ฐ๋ก node instance ๋ง๋ค์ด์ฃผ๊ธฐ
self.head = Node(data)
return True
else:
node = self.tail
while node.data != before_data: #๋ด๊ฐ ์ฐพ๋ ๊ฐ์ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต
node = node.prev
if node == None: #๋ด๊ฐ ์ฐพ๋ ๊ฐ์ด ์์
return False
new = Node(data) #์ผ์นํ๋ ๊ฐ์ ์ฐพ์ผ๋ฉด ์ฝ์
ํ node๋ฅผ ์๋ก์ด ๋ณ์์ ํ ๋น
before_new = node.prev #์๋ node์ ์ด์ ๋
ธ๋ ๋ณ์๋ก ์ ์
before_new.next = new
new.next = node
return True
def insert_after(self, data, after_data):
if self.head == None:
self.head = Node(data)
return True
else:
node = self.head
while node.data != after_data:
node = node.next
if node == None:
return False
new = Node(data)
after_new = node.next
new.next = after_new
new.prev = node
node.next = new
if new.next == None:
self.tail = new
return True
before_new.next = new
,new.next = node
insert_before():
insert_after():
after_new.prev = new
๋ ์ด๋๊ฐ๊ฑธ๊นif new.next = None: self.tail = new
๋ ์ ์ฐ๋ ๊ฑธ๊น
'Algorithm > Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Data Structure (5) Graph (๊ทธ๋ํ) (0) | 2021.05.08 |
---|---|
Data Structure - Heap (ํ) | Python ๊ตฌํ (0) | 2021.05.07 |
Data Structure (3) Hash Table (ํด์ ํ ์ด๋ธ) (0) | 2021.05.07 |
Data Structure (2) Tree (ํธ๋ฆฌ) (0) | 2021.05.07 |
๋๊ธ