Programming/leetcode

641. Design Circular Deque

홍열 2021. 2. 19. 10:32
728x90

deQueue 구현 문제

 

deQueue는 이중 연결리스트로 많이 구현한다. (left, right)

앞, 뒤로 추가 가능하다. 

head와 tail은 제일 앞에 ListNode와 맨 뒤의 ListNode를 가르키고 있다. 

 

만약 제일 앞에 새로운 값을 추가하려면, 

head를 새로운 ListNode를 가르키게 하고, 이전 값을 연결해주면 된다. 

 

head, tail에서 add를 공통으로 하기 위해서 오른쪽에 추가하는걸 기준으로 _add함수를 만들었다.

del 역시 공통으로 사용하기 위해서 오른쪽 자식을 삭제하는걸 기준으로 잡았다. 

 

add, del시에 tail에서는 어느 부분을 가르켜야되는지 손으로 그려보면 잘 알 수 있다. 

class MyCircularDeque:
    def __init__(self, k: int):
        self.k, self.cur = k, 0
        self.head, self.tail = ListNode(None), ListNode(None)
        #처음에는 아무것도 없으니 head와 tail을 서로 연결 시켜줌
        self.head.right, self.tail.left = self.tail, self.head
        
    def _add(self, node:ListNode, new:ListNode):
        before = node.right
        node.right = new
        new.left, new.right = node, before
        before.left = new

    def _del(self, node:ListNode):
        # head, tail은 마지막 ListNode를 알려주기만할뿐...
        # 지울때는 head,tail을 현재것의 한칸 더 옆으로 옮기면 된다.
        # a - b - c - tail일때 b-tail을 직접 연결하는 것
        
        n = node.right.right
        node.right = n
        n.left = node
    def insertFront(self, value: int) -> bool:
        """
        Adds an item at the front of Deque. Return true if the operation is successful.
        """
        if self.cur == self.k:
            return False

        self.cur += 1
        self._add(self.head, ListNode(value))
        return True

    def insertLast(self, value: int) -> bool:
        """
        Adds an item at the rear of Deque. Return true if the operation is successful.
        """
        if self.cur == self.k:
            return False

        self.cur += 1
        #항상 오른쪽을 기준으로 추가하는 것
        self._add(self.tail.left, ListNode(value))
        return True



    def deleteFront(self) -> bool:
        """
        Deletes an item from the front of Deque. Return true if the operation is successful.
        """
        if self.cur == 0:
            return False

        self.cur -= 1
        self._del(self.head)
        return True
    def deleteLast(self) -> bool:
        """
        Deletes an item from the rear of Deque. Return true if the operation is successful.
        """
        if self.cur == 0:
            return False
        self.cur -= 1
        self._del(self.tail.left.left)
        return True

    def getFront(self) -> int:
        """
        Get the front item from the deque.
        """
        return self.head.right.val if self.cur else -1

    def getRear(self) -> int:
        """
        Get the last item from the deque.
        """
        return self.tail.left.val if self.cur else -1

    def isEmpty(self) -> bool:
        """
        Checks whether the circular deque is empty or not.
        """
        return self.cur == 0

    def isFull(self) -> bool:
        """
        Checks whether the circular deque is full or not.
        """
        return self.cur == self.k