ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 연결리스트 연습문제
    알고리즘/이론정리 2021. 9. 9. 17:07

    연결리스트에 관한 삽입 삭제 순회의 함수들을 모두 구현한 것이다.

    문제는 popAt()함수를 구현하는 것이었다.

    class Node:
    
        def __init__(self, item):
            self.data = item
            self.next = None
    
    
    class LinkedList:
    
        def __init__(self):
            self.nodeCount = 0
            self.head = None
            self.tail = None
    
    
        def getAt(self, pos):
            if pos < 1 or pos > self.nodeCount:
                return None
    
            i = 1
            curr = self.head
            while i < pos:
                curr = curr.next
                i += 1
    
            return curr
    
    
        def insertAt(self, pos, newNode):
            if pos < 1 or pos > self.nodeCount + 1:
                return False
    
            if pos == 1:
                newNode.next = self.head
                self.head = newNode
    
            else:
                if pos == self.nodeCount + 1:
                    prev = self.tail
                else:
                    prev = self.getAt(pos - 1)
                newNode.next = prev.next
                prev.next = newNode
    
            if pos == self.nodeCount + 1:
                self.tail = newNode
    
            self.nodeCount += 1
            return True
    
    
        def popAt(self, pos):
            if pos < 1 or pos > self.nodeCount:
                raise IndexError
                
            curr = self.getAt(pos)
            prev = self.getAt(pos-1)
            
            if self.nodeCount == 1: #유일한 노드 삭제
                self.head = None
                self.tail = None
    
            else:
                if pos == 1: #첫번째꺼 삭제
                    self.head = curr.next
                    
                elif pos == self.nodeCount: # 맨끝에꺼 삭제
                    self.tail = prev
                    prev.next = None
                else: #맨끝이 아닌경우
                    prev.next = curr.next
    
            self.nodeCount -= 1
            return curr.data
    
    
        def traverse(self):
            result = []
            curr = self.head
            while curr is not None:
                result.append(curr.data)
                curr = curr.next
            return result
    
    
    def solution(x):
        return 0

    처음 시작할 때 indexAt함수를 변형했다.

    삽입 할 때와 달리 연결리스트에서 유일한 노드를 삭제할 때는 또 다른 IF문으로 처리를 해줘야했다.

    그래..여기까진 맞았어

    자꾸 맞는것 같은데 오류가 나서 매우 답답했음...

    이유가 뭐였냐면

    1. nodeCount 처리

    삽입할때랑 삭제할 때의 경우를 잘 생각해보지 않았다. (insertAt 그냥 갖다 쓰다보니 ...)

    2. 대입 문제

    멍청하게 거꾸로 대입하고 있었다....

    pos == 1 일때 self.head = curr.next 가 아니라 반대로 대입문을 작성했음 ㅜ

     

     

    def popAt(self, pos):
            if pos < 1 or pos > self.nodeCount:
                raise IndexError
                
            curr = self.getAt(pos)
            prev = self.getAt(pos-1)
            
            if self.nodeCount == 1: #유일한 노드 삭제
                self.head = None
                self.tail = None
    
            else:
                if pos == 1: #첫번째꺼 삭제
                    self.head = curr.next
                    
                elif pos == self.nodeCount: # 맨끝에꺼 삭제
                    self.tail = prev
                    prev.next = None
                else: #맨끝이 아닌경우
                    prev.next = curr.next
    
            self.nodeCount -= 1
            return curr.data

    '알고리즘 > 이론정리' 카테고리의 다른 글

    그리디(Greedy) 알고리즘  (0) 2022.08.03
    양방향 연결리스트(Doubly Linked Lists)  (0) 2021.09.14
    연결리스트 (2)  (0) 2021.09.09
    연결리스트(Linked Lists)  (0) 2021.09.08
    알고리즘의 복잡도  (0) 2021.09.08
Designed by Tistory.