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

๋ฐ˜์‘ํ˜•

์กฐ๊ธˆ ์˜ค๋ž˜ ์ „์ธ๊ฒƒ๊ฐ™์€๋ฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ ์ž๋ฃŒ๊ตฌ์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ด€๋ จ ๊ฐ•์˜๋ฅผ ๊ตฌ๋งคํ•˜๊ณ  ์ˆ˜๊ฐ•ํ•˜๋‹ค๊ฐ€ ๋‚ด๊ฐ€ ์Šค์Šค๋กœ ๊ตฌํ˜„ํ•ด๋‚ด๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์„œ(๋ถ„๋ช…ํžˆ ์‰ฌ์šด ๋ถ€๋ถ„์ผํ…๋ฐ) ์ค‘๊ฐ„์— ์†์„ ๋–ผ๋ฒ„๋ฆฐ์ง€๊ฐ€ ๊ฝค ์‹œ๊ฐ„์ด ์ง€๋‚œ๊ฒƒ๊ฐ™๋‹ค. ์š”์ฆ˜ ์ผ์„ ํ•˜๋ฉด์„œ ๋ฌด์—‡์„ ๊ณต๋ถ€ํ•ด์•ผํ• ์ง€ ๋ง‰๋ง‰ํ•ดํ•˜๋‹ค๊ฐ€ ๋‹ค์‹œ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํƒ„ํƒ„ํžˆ ๋‹ค์ ธ์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์— ๊ฐ•์˜ ์ˆ˜๊ฐ•์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

์ฒ˜์Œ ๋“ค์—ˆ์„๋•Œ๋Š” ํŒŒ์ด์ฌ์ด๋ผ๋Š” ์–ธ์–ด์— ๊ทธ๋‹ค์ง€ ์ต์ˆ™ํ•˜์ง€๊ฐ€ ์•Š์•„์„œ (์ง€๊ธˆ๋„ ๋ฌผ๋ก  ๋ถ€์กฑํ•˜์ง€๋งŒ) ์งˆ๋ฌธ์„ ํ•ด๋„ ์ดํ•ด๋ฅผ ํ•˜์ง€ ๋ชปํ•˜์˜€๊ณ  ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋‹ˆ ์†์„ ๋†”๋ฒ„๋ ธ๋Š”๋ฐ ๊ทธ๋ž˜๋„ ๋‚ด๊ฐ€ ๊ทธ ์‚ฌ์ด์— ์‚ด์ง ์„ฑ์žฅํ•˜๊ธด ํ–ˆ๋‚˜๋ณด๋‹ค. ๊ทธ๋•Œ ์–ด๋ ต๊ณ  ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ๋“ค์ด ๊ทธ๋ž˜๋„ ์‰ฝ๊ฒŒ ํ’€๋ ค์„œ ์ด๋ฒˆ์—๋Š” ๊ผญ ์™„๊ฐ•์„ ํ•ด๋ณผ ์ƒ๊ฐ์ด๋‹ค. 

 

 

์•„ ์‚ญ์ œํ•˜๊ธฐ ์ž˜ ๊ตฌํ˜„ํ•œ๊ฑฐ ๊ฐ™์€๋ฐ!!!!!!!!!!!!!!!!!!!!??

# Node ํด๋ž˜์Šค
class Node:
    # ์ƒ์„ฑ์ž
    def __init__(self, item):
        self.data = item
        self.next = None
        
# LinkedList ํด๋ž˜์Šค
class LinkedList:
    # ์ƒ์„ฑ์ž
    def __init__(self):
        self.nodeCount = 0
        self.head = None
        self.tail = None
        
    # ๊ทธ๋ƒฅ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ
    def __repr__(self):
        if self.nodeCount == 0:
            return 'LinkedList: empty'

        s = ''
        curr = self.head
        while curr is not None:
            s += repr(curr.data)
            if curr.next is not None:
                s += ' -> '
            curr = curr.next
        return s
    
        
    # 1. ํŠน์ • ์›์†Œ ์ฐธ์กฐ
    def getAt(self, pos):
        # ํŠน์ •์œ„์น˜๊ฐ€ 0๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๋…ธ๋“œ์˜ ๊ธธ์ด๋ณด๋‹ค ํฌ๋ฉด None์„ ๋ฐ˜ํ™˜
        if pos <= 0 or pos > self.nodeCount:
            return None
        
        i = 1
        curr = self.head # ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ด
        
        # i๊ฐ€ pos๋ณด๋‹ค ์ž‘์€ ๋™์•ˆ์— i๋ฅผ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ curr๋ฅผ curr์˜ next๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ํ•œ๋‹ค
        # ์ฆ‰ pos-1๋ฒˆ ๋งŒํผ ์ „์ง„ํ•˜๋ฉด ๊ทธ๋•Œ curr๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋ฆฌํ„ดํ•˜๋ ค๋Š” pos๋ฒˆ์งธ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค
        while i < pos: 
            curr = curr.next
            i += 1
        
        return curr
    
    # 2. ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ
    def traverse(self):
        result = []
        curr = self.head
        while curr is not None:
            result.append(curr.data)
            curr = curr.next
        return result
    
    # 3. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ - ์›์†Œ์˜ ์‚ฝ์ž…
    def insertAt(self, pos, newNode):
        # pos์˜ ์œ„์น˜๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธ
        if pos < 1 or pos > self.nodeCount + 1 :
            # pos์œ„์น˜๊ฐ€ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„ ๋ฐ–์— ์žˆ์„ ๋•Œ False ๋ฐ˜ํ™˜
            return False
        
        # ๋…ธ๋“œ๋ฅผ ๋งจ ์ฒ˜์Œ ์œ„์น˜์— ์‚ฝ์ผํ•  ๋•Œ(prev์—†์Œ)
        if pos == 1: # (๋นˆ ๋…ธ๋“œ์˜ ์‚ฝ์ž…ํ•  ์กฐ๊ฑด์— ๊ฑธ๋ฆผ)
            newNode.next = self.head # ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ next๋Š” head
            self.head = newNode # ํ—ค๋“œ๊ฐ€ ์ƒˆ๋กœ์šด๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค
        
        # ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ€ ์ฒ˜์Œ์ด ์•„๋‹ ๋•Œ
        else: 
            if pos == self.nodeCount + 1: # ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ€ ๋งจ๋์ผ ๋•Œ
                prev = self.tail # prev == tail๊ณผ ๊ฐ™์Œ(์•ž์—์„œ ๋ถ€ํ„ฐ ์ฐพ์„ ํ•„์š” ์—†์Œ)
            else: # ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ€ ์ฒ˜์Œ๋„ ์•„๋‹ˆ๊ณ  ๋งจ๋๋„ ์•„๋‹ ๋•Œ
                prev = self.getAt(pos-1) # ๋ผ์›Œ๋„ฃ์œผ๋ ค๋Š” ์ง์ „์˜ ์œ„์น˜๋ฅผ ์–ป์–ด๋‚ธ๋‹ค
            
            newNode.next = prev.next # ์ƒˆ๋กœ์šด ๋…ธ๋“œ๊ฐ€ prev.next๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋กํ•œ๋‹ค.
            prev.next = newNode # prev.next๋ฅผ newNode๋กœ ํ•œ๋‹ค
        
        # ๋งจ ๋งˆ์ง€๋ง‰ ์œ„์น˜์— ์‚ฝ์ž… ํ•  ๋•Œ (๋นˆ ๋…ธ๋“œ์˜ ์‚ฝ์ž…ํ•  ์กฐ๊ฑด์— ๊ฑธ๋ฆผ)
        if pos == self.nodeCount + 1:
            self.tail = newNode # Tail์„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝ
            
        # ๋งˆ์ง€๋ง‰์œผ๋กœ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜ ์ฆ๊ฐ€
        self.nodeCount += 1
        return True
    
    
    # 4. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ - ์›์†Œ์˜ ์‚ญ์ œ
    def popAt(self, pos):
        # pop ๊ฐ’์ด ์œ ํšจํ•œ์ง€ ํ™•์ธ ์ ๋‹นํ•œ ๊ฐ’์ด ์•„๋‹ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฐœ์ƒ
        if pos < 1 or pos > self.nodeCount:
            raise IndexError
            
        # ๋งจ ์•ž์˜ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ
        if pos == 1:
            curr = self.head
            self.head = self.getAt(pos+1)
            
            # ์œ ์ผํ•œ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
            if self.nodeCount == 1:
                self.tail = None
                self.head = None
        
        # ๋งจ ์•ž์˜ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ ๋•Œ
        else:
            prev = self.getAt(pos-1)
            curr = self.getAt(pos)
            prev.next = curr.next
            
            # ๋งจ ๋ ๋…ธ๋“œ์ผ ๋•Œ
            if pos == self.nodeCount:
                self.tail = prev
                
        r = curr.data
        self.nodeCount -= 1
        
        return r
                
            
    # 5. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ - ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ์—ฐ๊ฒฐ
    def concat(self, L):
        # ์›๋ž˜ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ๋์ด ์ด์–ด๋ถ™์ด๋ ค๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ์œผ๋กœ
        self.tail.next = L.head
        # ๋ฆฌ์ŠคํŠธ L์ด ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ
        if L.tail:
            self.tail = L.tail
        self.nodeCount += L.nodeCount
        

        
a = Node(67)
b = Node(34)
c = Node(28)
d = Node(33)

L = LinkedList()
print(L)

print(L.insertAt(1, a))
print(L.insertAt(2, b))
print(L.insertAt(3, c))

print(L)
print(L.insertAt(1, d))
print(L)

print(L.popAt(2))
print(L)
print(L.popAt(1))
print(L)
print(L.popAt(2))
print(L)
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€