플랫폼: 프로그래머스
강의명: 어서와! 자료구조와 알고리즘은 처음이지?
강사명: 이시윤
이중 연결 리스트라고도 한다.
class Node:
def __init__(self, data) -> None:
self.data = data
self.prev = None
self.next = None
class DoublyLinkedList:
def __init__(self) -> None:
self.node_cnt = 0
self.head = Node(None)
self.tail = Node(None)
self.head.next = self.tail
self.tail.prev = self.head
def traverse(self):
cur = self.head.next
result = []
while cur.next:
result.append(cur.data)
return result
def reverse(self):
cur = self.tail.prev
result = []
while cur.prev:
result.append(cur.data)
return result
def insert_after(self, prev: Node, new_node: Node) -> bool:
next = prev.next
new_node.prev = prev
new_node.next = next
prev.next = new_node
next.prev = new_node
self.node_cnt += 1
return True
def get_at(self, pos: int) -> Node:
if pos < 1 or pos > self.node_cnt + 1:
raise IndexError
if pos > self.node_cnt // 2:
cur = self.tail
for _ in range(self.node_cnt - pos + 1):
cur = cur.prev
else:
cur = self.head
for _ in range(pos):
cur = cur.next
return cur
def insert_at(self, pos: int, new_node: Node) -> bool:
prev = self.get_at(pos-1)
return self.insert_after(prev, new_node)
def insert_before(self, next: Node, new_node: Node) -> bool:
prev = next.prev
prev.next = new_node
new_node.prev = prev
new_node.next = next
next.prev = new_node
self.node_cnt += 1
return True
def pop_after(self, prev: Node) -> int:
res = prev.next.data
next = prev.next.next
prev.next = next
next.prev = prev
self.node_cnt -= 1
return res
def pop_before(self, next: Node) -> int:
res = next.prev.data
prev = next.prev.prev
prev.next = next
next.prev = prev
self.node_cnt -= 1
return res