- data : 실제 저장하려는 데이터
- link : 다음 노드
class Node():
def __init__(self, data=None) -> None:
self.__data = data
self.__prev = None
self.__next = None
def __delete__(self):
print("data of {} is deleted".format(self.data))
# 소멸자 : 객체가 사라지기 전에 반드시 호출됨
# 삭제 연산 시 삭제되는 것 확인하기 위한 코드
def data(self):
return self.__data
#property
def data(self, data):
self.__data = data
#data.setter
def prev(self):
return self.__prev
#property
def prev(self, p):
self.__prev = p
#prev.setter
def next(self):
return self.__next
#property
def next(self, n):
self.__next = n
#next.setter
__init__
생성자__data
: 데이터를 저장__prev
: 이전 노드 참조__next
: 다음 노드 참조class DoubleLinkedList:
def __init__(self):
self.head = Node()
self.tail = Node()
# 더미 노드 : 맨처음과 맨끝 노드는 데이터를 저장하지 않음
self.head.next = self.tail
self.tail.prev = self.head
#head, tail 연결
self.d_size = 0
# 데이터의 개수를 저장할 변수
doubleLinkedList
클래스head
: 리스트 맨 앞의 더미노드tail
: 리스트 맨 뒤의 더미노드d_size
: 리스트 내 데이터 개수def empty(self):
if self.d_size == 0:
return True
else : return False
def size(self):
return self.d_size
empty()
메서드 size()
메서드 def add_first(self, data):
new_node = Node(data)
new_node.next = self.head.next # 더미노드의 다음노드, 즉 첫번째 노드를 가리킴
new_node.prev = self.head # prev는 리스트의 맨 앞 더미를 가리킴
self.head.next.prev = new_node
self.head.next = new_node
self.d_size += 1
new_node = Node(data)
: 새로운 노드 생성new_node.next = self.head.next
new_node.prev = self.head
-> 여기까지는 새로운 노드에서 각각 head와 첫 번째 노드를 단방향으로만 연결하였음
self.head.next.prev = new_node
self.head.next = new_node
def add_last(self, data):
new_node = Node(data)
new_node.next = self.tail
new_node.prev = self.tail.prev
self.tail.prev = new_node
self.tail.prev.next = new_node
self.d_size += 1
new_node = Node(data)
new_node.next = self.tail
new_node.prev = self.tail.prev
self.tail.prev = new_node
self.tail.prev.next = new_node
def insert_after(self, data, node):
new_node = Node(data)
new_node.next = node.next
new_node.prev = node
node.next.prev = new_node
node.next = new_node
self.d_size += 1
new_node = Node(data)
new_node.next = node.next
new_node.prev = node
node.next.prev = new_node
node.next = new_node
def insert_before(self, data, node):
new_node = Node(data)
new_node.next = node
new_node.prev = node.prev
node.prev.next = new_node
node.prev = new_node
self.d_size += 1
new_node = Node(data)
new_node.next = node
new_node.prev = node.prev
node.prev.next = new_node
node.prev = new_node
def search_forward(self, target):
cur = self.head.next
while cur is not self.tail :
if cur.data == target :
return cur
cur = cur.next
return None
def search_backward(self, target):
cur = self.tail.prev
while cur is not self.head :
if cur.data == target :
return cur
cur = cur.prev
return None
cur = self.head.next
while cur is not self.tail
def delete_first(self):
if self.empty():
return
self.head.next = self.head.next.prev
self.head.next.prev = self.head
self.d_size -= 1
if self.empty(): return
self.head.next = self.head.next.prev
self.head.next.prev = self.head
def delete_last(self):
if self.empty():
return
self.tail.prev = self.tail.prev.prev
self.tail.prev.next = self.tail
self.d_size -= 1
self.tail.prev = self.tail.prev.prev
self.tail.prev.next = self.tail
def delete_node(self, node):
node.prev.next = node.next
node.next.prev = node.prev
self.d_size -= 1
node.prev.next = node.next
node.next.prev = node.prev