알고리즘/이론정리

연결리스트 연습문제

팽팽 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