앞서 9장에서는 원형 큐를 배열로 구현해봤고, 이번에는 원형 데크를 연결리스트로 구현해봤다. 그런데 원형 데크를 이중 연결리스트로 구현하게 되면 원형의 이점을 전혀 살릴 수 없게 된다. 이 문제는 데크를 소개하면서, 이중 연결 리스트로 구현이 가능하다는 것을 보여주기 위한 구현일 뿐, 실제로 원형의 이점을 살리기 위해서라면 원래 이 문제는 연결리스트가 아닌 배열로 풀이해야 한다.
문제
다음 연산을 제공하는 원형 데크를 디자인하라.
입력
출력
풀이
class MyCircularDeque(object): def __init__(self, k): """ :type k: int """ self.head, self.tail = ListNode(None), ListNode(None) self.k, self.len = k, 0 #최대 길이, 현재 길이 정보 self.head.right, self.tail.left = self.tail, self.head def _add(self, node, new): n = node.right node.right = new new.left, new.right = node, n n.left = new def _del(self, node): n = node.right.right node.right = n n.left = node def insertFront(self, value): """ :type value: int :rtype: bool """ if self.len == self.k: return False self.len += 1 self._add(self.head, ListNode(value)) return True def insertLast(self, value): """ :type value: int :rtype: bool """ if self.len == self.k: return False self.len += 1 self._add(self.tail.left, ListNode(value)) return True def deleteFront(self): """ :rtype: bool """ if self.len == 0: return False self.len -= 1 self._del(self.head) return True def deleteLast(self): """ :rtype: bool """ if self.len == 0: return False self.len -= 1 self._del(self.tail.left.left) return True def getFront(self): """ :rtype: int """ n = self.head.right return n.val if self.len else -1 def getRear(self): """ :rtype: int """ n = self.tail.left return n.val if self.len else -1 def isEmpty(self): """ :rtype: bool """ return self.len == 0 def isFull(self): """ :rtype: bool """ return self.len == self.k # Your MyCircularDeque object will be instantiated and called as such: # obj = MyCircularDeque(k) # param_1 = obj.insertFront(value) # param_2 = obj.insertLast(value) # param_3 = obj.deleteFront() # param_4 = obj.deleteLast() # param_5 = obj.getFront() # param_6 = obj.getRear() # param_7 = obj.isEmpty() # param_8 = obj.isFull()