ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

์ง€๊ธˆ๊นŒ์ง€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ๋งํฌ๊ฐ€ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ, ๋‹ค์‹œ ๋งํ•˜์ž๋ฉด ๋จผ์ € ์˜ค๋Š” ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ๋‹ด์€ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๊ทธ ๋’ค์— ์˜ค๋Š” ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ๋‹ด์€ ๋…ธ๋“œ๋ฅผ ํ–ฅํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์—ˆ๋‹ค. ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋…ธ๋“œ๋“ค์ด ์•ž/๋’ค๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค. ์•ž(๋‹ค์Œ 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

 

 

 

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€