ํฐ์คํ ๋ฆฌ ๋ทฐ
์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ (Doubly Listed Lists)
yeahajeong 2020. 6. 19. 17:31์ง๊ธ๊น์ง ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ ๋งํฌ๊ฐ ํ ๋ฐฉํฅ์ผ๋ก, ๋ค์ ๋งํ์๋ฉด ๋จผ์ ์ค๋ ๋ฐ์ดํฐ ์์๋ฅผ ๋ด์ ๋ ธ๋๋ก๋ถํฐ ๊ทธ ๋ค์ ์ค๋ ๋ฐ์ดํฐ ์์๋ฅผ ๋ด์ ๋ ธ๋๋ฅผ ํฅํ๋ ๋ฐฉํฅ์ผ๋ก๋ง ์ฐ๊ฒฐ๋์ด ์์๋ค. ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ ธ๋๋ค์ด ์/๋ค๋ก ์ฐ๊ฒฐ๋์ด์๋ค. ์(๋ค์ node)์ผ๋ก๋ ๋ค(์ด์ node)๋ก๋ ์งํ์ด ๊ฐ๋ฅํ๋ค.
Node์ ๊ตฌ์กฐํ์ฅ
# Node ํด๋์ค
class Node:
def __init__(self, itme):
self.date = item
self.prev = None
self.next = None
์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌ์กฐ
๋ฆฌ์คํธ์ ์ฒ์๊ณผ ๋์ dummy node๋ฅผ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ญ๊ฐ ์ข์๊ฐ? ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ node๋ค์ด ๋ชจ๋ ๊ฐ์ ๋ชจ์์ด ๋๋ค. ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ ์์ด ์๋นํ ํธ์ํด์ง๊ฒ ๋๋ค.
# ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ํด๋์ค
class DoublyLinkedList:
def __init__(self, item):
self.nodeCount = 0
self.head = Node(None)
self.tail = Node(None)
self.head.prev = None
self.head.next = self.tail
self.tail.prev = self.head
self.tail.next = None
๋ฆฌ์คํธ ์ํ
while๋ฌธ ์์์ ํ์ฌ ๋ ธ๋์ ๋ค์๋ค์์ด ์ ํจํ ๋ ๊น์ง ๋ฐ๋ณตํ๋ค. ๋ฆฌ์คํธ๊ฐ ๋น์ด์๋ ๊ฒฝ์ฐ์์๋ ์ ํจํ ์ฝ๋๊ฐ ๋๋ค.
# ๋ฆฌ์คํธ ์ํ
def traverse(self):
result = []
curr = self.head
while curr.next.next:
curr = curr.next
result.append(curr.data)
return result
๋ฆฌ์คํธ ์ญ์ํ
# ๋ฆฌ์คํธ ์ญ์ํ
def reverse(self):
result = []
curr = self.tail
while curr.prev.prev:
curr = curr.prev
result.append(curr.data)
return result
์์์ ์ฝ์ insertAfter()
์์์ ์ฝ์ ์ฝ๋ ๊ตฌํ
# ์์์ ์ฝ์
def insertAfter(self, prev, newNode):
next = prev.next
nextNode.prev = prev
newNode.next = next
prev.next = newNode
next.prev = newNode
self.nodeCount += 1
return True
ํน์ ์์ ์ป์ด๋ด๊ธฐ getAt()
ํน์ ์์ ์ป์ด๋ด๋๊ฒ์ ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋์ผํ๋ค.
# ํน์ ์์ ์ป์ด๋ด๊ธฐ
def getAt(self, pos):
if pos < 0 or pos > self.nodeCount:
return None
i = 0
curr = self.head
while i < pos:
curr = curr.next
i += 1
return curr
์์์ ์ฝ์ insertAt()
# ์์์ ์ฝ์
def insertAt(self, pos, newNode):
if pos < 1 or pos > self.nodeCount + 1:
return False
prev = self.getAt(pos-1)
return self.insertAfter(prev, newNode)
๋ฆฌ์คํธ ๋ง์ง๋ง์ ์์๋ฅผ ์ฝ์ ํ๋ ค๋ฉด getAt์ ์์ ํด์ ๊ตฌํํ๋ค.
getAt() ์ฝ๋์ ๊ฐ์
# ํน์ ์์ ์ป์ด๋ด๊ธฐ
def getAt(self, pos):
if pos < 0 or pos > self.nodeCount:
return None
# pos๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์น์ฐ์ณ์๋ ๊ฒฝ์ฐ tail์ชฝ์์ ๊ณ์ฐ
if pos > self.nodeCount // 2:
i = 0
curr = self.tail
while i < self.nodeCount - pos + 1:
curr = curr.prev
i += 1
# pos๊ฐ ์ผ์ชฝ์ผ๋ก ์น์ฐ์ณ ์๋ ๊ฒฝ์ฐ head์์ ๊ณ์ฐ
else:
i = 0
curr = self.head
while i < pos:
curr = curr.next
i += 1
return curr
ํน์ ์์์ ์์น๊ฐ ์ผ์ชฝ์ผ๋ก ์น์ฐ์ณ์์ผ๋ฉด head๋ก ๋ถํฐ, ์ค๋ฅธ์ชฝ์ผ๋ก ์น์ฐ์ณ์๋ค๋ฉด tail๋ก ๋ถํฐ ํ์ํ์ฌ ์ฝ์ ์ ํ ์ ์๋๋ก ์ฝ๋๋ฅผ ๊ฐ์ ์ ํด์ฃผ์ด์ ์กฐ๊ธ ๋ ํจ์จ์ ์ด๊ฒ ๋ง๋ค์๋ค. ํ์ง๋ง ์ฌ์ ํ ๋ฆฌ์คํธ๊ฐ ๊ธธ์ด์ง๋ฉด ๊ธธ์ด์ง์๋ก ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๋ ์ ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์์์ ์ญ์
def popAfter(self, prev):
curr = prev.next
prev.next = curr.next
curr.next.prev = prev
self.nodeCount -= 1
return curr.data
def popBefore(self, next):
curr = next.prev
next.prev = curr.prev
curr.prev.next = next
self.nodeCount -= 1
return curr.data
def popAt(self, pos):
if pos < 1 or pos > self.nodeCount:
raise IndexError
prev = self.getAt(pos-1)
return self.popAfter(prev)
๋ ๋ฆฌ์คํธ์ ๋ณํฉ
# ๋ ๋ฆฌ์คํธ์ ๋ณํฉ
def concat(self, L):
self.tail.prev.next = L.head.next
L.head.next.prev = self.tail.prev
self.tail = L.tail
self.nodeCount += L.nodeCount
'(๊ตฌ)์๋ฃ๊ตฌ์กฐ&์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ(Stacks) - ์์์ ๊ดํธ ์ ํจ์ฑ ๊ฒ์ฌ (0) | 2020.06.23 |
---|---|
์คํ(Stacks) (1) | 2020.06.22 |
์ฐ๊ฒฐ ๋ฆฌ์คํธ (Linked List) - ๋๋ฏธ ๋ ธ๋ ์ถ๊ฐ (0) | 2020.06.19 |
์ฐ๊ฒฐ ๋ฆฌ์คํธ (Linked List) (0) | 2020.06.18 |
์์ (0) | 2020.06.18 |
- Total
- Today
- Yesterday
- typeAliases
- ์ดํด๋ฆฝ์ค ์ค์น
- ๊ฒ์ํ ์กฐํ
- ์จ๋ฆฌ์์ค
- ๋ถํธ ์๋์์ฑ
- ๊ฒ์ํ๋ง๋ค๊ธฐ
- ๊ฐ๋ฐํ๊ฒฝ๊ตฌ์ถ
- ์๋ฃ๊ตฌ์กฐ
- ๋ณ๋ช ์ฒ๋ฆฌ
- ์๊ณ ๋ฆฌ์ฆ
- ๊ฒ์๋ฌผ ์ญ์
- ๊ฒ์๋ฌผ์กฐํ
- mysql์ค์น
- java ํ๊ฒฝ๋ณ์
- ๊ฐ๋ฐ
- ์ดํด๋ฆฝ์ค ํ๊ธ ์ธ์ฝ๋ฉ
- ์ ์ฒด๊ฒ์๋ฌผ ์กฐํ
- java jdk ์ค์น
- ๊ฒ์ํ ์ญ์
- tomcat์ค์น
- ์๋ฐ
- Java
- ์คํ๋ง๋ถํธ ์๋์์ฑ
- Algorithm
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |