ํฐ์คํ ๋ฆฌ ๋ทฐ
์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ (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
 
- tomcat์ค์น
 - ๊ฒ์๋ฌผ์กฐํ
 - ์ดํด๋ฆฝ์ค ์ค์น
 - java ํ๊ฒฝ๋ณ์
 - ์๋ฐ
 - ์ ์ฒด๊ฒ์๋ฌผ ์กฐํ
 - ์ดํด๋ฆฝ์ค ํ๊ธ ์ธ์ฝ๋ฉ
 - ์๋ฃ๊ตฌ์กฐ
 - ๊ฒ์ํ๋ง๋ค๊ธฐ
 - mysql์ค์น
 - ์๊ณ ๋ฆฌ์ฆ
 - ๊ฒ์ํ ์ญ์ 
 - ์คํ๋ง๋ถํธ ์๋์์ฑ
 - ๋ถํธ ์๋์์ฑ
 - Java
 - ๊ฒ์ํ ์กฐํ
 - ๊ฒ์๋ฌผ ์ญ์ 
 - java jdk ์ค์น
 - ๊ฐ๋ฐ
 - ์จ๋ฆฌ์์ค
 - Algorithm
 - ๊ฐ๋ฐํ๊ฒฝ๊ตฌ์ถ
 - ๋ณ๋ช ์ฒ๋ฆฌ
 - typeAliases
 
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ | 
|---|---|---|---|---|---|---|
| 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 |