๋งํฌ๋ ๋ฆฌ์คํธ (Linked List) ?
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ๋ฐฐ์ด์ ์์ฐจ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋์ดํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ๋จ์ด์ง ๊ณณ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ดํ๋ก ์ฐ๊ฒฐํด์ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- C์์๋ ์ฃผ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ง๋ง, Python์ ๋ฆฌ์คํธ ํ์ ์ด ๋งํฌ๋ ๋ฆฌ์คํธ์ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ง์
- ๊ธฐ๋ณธ ๊ตฌ์กฐ
- ๋ ธ๋(Node) : ๋ฐ์ดํฐ ์ ์ฅ ๋จ์(๋ฐ์ดํฐ๊ฐ, ํฌ์ธํฐ)๋ก ๊ตฌ์ฑ
- ํฌ์ธํฐ(Pointer) : ๊ฐ ๋ ธ๋ ์์์, ๋ค์์ด๋ ์ด์ ์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ณต๊ฐ
- ์ฅ์ (C์ธ์ด ์
์ฅ์์)
- ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ ๊ณต๊ฐ์ ๋ฏธ๋ฆฌ ํ ๋นํ์ง ์์๋ ๋จ (๋ฐฐ์ด์ ํ ๋น ํ์)
- ๋จ์ (C์ธ์ด ์
์ฅ์์)
- ์ฐ๊ฒฐ์ ์ํ ๋ณ๋ ๋ฐ์ดํฐ ๊ณต๊ฐ์ด ํ์ํ๋ฏ๋ก, ์ ์ฅ๊ณต๊ฐ ํจ์จ์ด ๋์ง ์์
- ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ฐพ๋ ์๊ฐ์ด ํ์ํ๋ฏ๋ก ์ ๊ทผ ์๋๊ฐ ๋๋ฆผ
- ์ค๊ฐ ๋ฐ์ดํฐ ์ญ์ ์, ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ์ ์ฌ๊ตฌ์ฑํด์ผํ๋ ๋ถ๊ฐ์ ์ธ ์์ ํ์
node : ํ๋์ ๋ฐ์ดํฐ | |
data | pointer : ๋ค์ ๋ฐ์ดํฐ ์ฃผ์ |
class Node:
def __init__(self, data):
self.data = data
self.next = None
# ์ ์ฝ๋ ๋ค๋ฅด๊ฒ ํํ
class Node:
def __init__(self, data, next=None):
self.data = data
self.next = next
# Node์ Node ์ฐ๊ฒฐ (ํฌ์ธํฐ ํ์ฉ)
node1 = Node(1)
node2 = Node(2)
node1.next = node(2)
head = node1
# ๋งํฌ๋ ๋ฆฌ์คํธ๋ก ๋ฐ์ดํฐ ์ถ๊ฐ
def add(data):
node = head
while node.next: #๋ง์ง๋ง ์์น ์ฐพ๋ ๊ณผ์
node = node.next
node.next = Node(data) #node.next = None ์ธ ๊ณณ์, data ์ถ๊ฐ
๋งํฌ๋ ๋ฆฌ์คํธ ๋ฐ์ดํฐ ์ฌ์ด์, ๋ฐ์ดํฐ ์ถ๊ฐ
# node : 1, 2, 3, 4, 5, 6, 7, 8, 9
node3 = Node(1.5)
node = head
search = True
while search:
if node.data == 1:
search = False
else:
node = node.next
node_next = node.next
node.next = node3
node3.next = node_next
# => new node : 1, 1.5, 2, 3, 4, 5, 6, 7, 8, 9
Python ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก 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:
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:
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
del temp
return
else:
node = node.next
linkedlist1 = NodeMgmt(0)
linkedlist1.desc() #0
linkedlist1.head #<__main__.Node at 0x1099fc6a0>
linkedlist1.delete(0) # -> ์ถ๋ ฅ๊ฒฐ๊ณผ๊ฐ ์๋ค๋ ๊ฒ์ head๊ฐ ์ญ์ ๋จ์ ์๋ฏธ
linkedlist1 = NodeMgmt(0)
linkedlist1 = NodeMgmt(1)
linkedlist1.delete(0)
linkedlist1.desc() #1
๋๋ธ ๋งํฌ๋ ๋ฆฌ์คํธ
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ์๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ด์, ๋ ธ๋ ํ์์ด ์์ชฝ์ผ๋ก ๋ชจ๋ ๊ฐ๋ฅ -> ํญ์ ์์์ ๋ถํฐ ๊ฒ์ํด์ผํ๋ ๊ธฐ์กด ๋จ์ ๊ทน๋ณต
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)
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)
node = node.next
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Data Structure] ์ถฉ๋(Collision) ํด๊ฒฐ ์๊ณ ๋ฆฌ์ฆ : ํด์ ํจ์ (0) | 2024.01.26 |
---|---|
[Data Structure] ํด์ ํ ์ด๋ธ (Hash Table) (0) | 2024.01.26 |
[Algorithm] ์๊ณ ๋ฆฌ์ฆ ๋ณต์ก๋ : ์๊ฐ ๋ณต์ก๋ / Big-O (๋น ์ค) ํ๊ธฐ๋ฒ (1) | 2024.01.26 |
[Data Structure] ๋ฐฐ์ด(array) / ํ(queue) / ์คํ(stack) (1) | 2024.01.26 |
[Algorithm] ์๋ฃ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ (0) | 2024.01.26 |