더블링크드리스트
- 링크드리스트의 일방향 탐색 기능을 개선한 자료구조
- 양방향으로 연결되어 있어서 노드 탐색이 양쪽으로 가능
class Node:
def __init__(self, data, prev=None, next=None):
self.prev = prev
self.data = data
self.next = next
class NodeMgmt:
def __init__(self, data):
self.head = Node(data)
self.tail = self.head
def insert(self,data):
if self.head == None:
self.head = Node(data)
self.tail = self.head
else:
node = self.head
while node.next:
node = node.next
new = Node(data)
node.next = new
new.prev = node
self.tail = new
def node_print(self):
node = self.head
while node:
print(node.data)
node = node.next
double_linkedlist = NodeMgmt(0) # 0 데이터 넣기
for data in range(1, 11): # 1~10 데이터 넣기
double_linkedlist.insert(data)
double_linkedlist.node_print()
문제1
데이터를 앞에서부터 검색하여 해당 값이 존재하는 경우 그 값을 반환하고 존재하지 않으면 False를 반환
def search_from_head(self, data):
if self.head == None:
return False
node = self.head
while node:
if node.data == data:
return node.data
else:
node = node.next
return False
문제2
데이터를 뒤에서부터 검색하여 해당 값이 존재하는 경우 그 값을 반환하고 존재하지 않으면 False를 반환
def search_from_tail(self, data):
if self.tail == None:
return False
node = self.tail
while node:
if node.data == data:
return node.data
else:
node = node.prev
return False
문제3
노드 데이터가 특정 숫자인 노드 앞에 데이터를 추가하는 메서드 만들기
단, 기준값을 찾지 못할 경우 데이터를 삽입하지 않음
insert_before(삽입할 데이터, 기준값)
삽입할 데이터: 실제 삽입될 데이터
기준값 앞에 실제 데이터가 삽입되도록 함
def insert_before(self, data, after_data):
if self.head == None:
self.head = Node(data)
return True
else:
node = self.tail
while node.data != after_data:
node = node.prev
if node == None:
return False
new = Node(data)
before_new = node.prev
before_new.next = new
new.prev = before_new
new.next = node
node.prev = new
return True
문제1~3 전체 적용 코드 및 테스트
class Node:
def __init__(self, data, prev=None, next=None):
self.prev = prev
self.data = data
self.next = next
class NodeMgmt:
def __init__(self, data):
self.head = Node(data)
self.tail = self.head
def insert(self,data):
if self.head == None:
self.head = Node(data)
self.tail = self.head
else:
node = self.head
while node.next:
node = node.next
new = Node(data)
node.next = new
new.prev = node
self.tail = new
def node_print(self):
node = self.head
while node:
print(node.data)
node = node.next
def search_from_head(self, data):
if self.head == None:
return False
node = self.head
while node:
if node.data == data:
return node.data
else:
node = node.next
return False
def search_from_tail(self, data):
if self.tail == None:
return False
node = self.tail
while node:
if node.data == data:
return node.data
else:
node = node.prev
return False
def insert_before(self, data, after_data):
if self.head == None:
self.head = Node(data)
return True
else:
node = self.tail
while node.data != after_data:
node = node.prev
if node == None:
return False
new = Node(data)
before_new = node.prev
before_new.next = new
new.prev = before_new
new.next = node
node.prev = new
return True
# 문제1 테스트
result = double_linkedlist.search_from_head(7)
print(result) # 7
result = double_linkedlist.search_from_head(17)
print(result) # False
# 문제2 테스트
result = double_linkedlist.search_from_tail(7)
print(result) # 7
result = double_linkedlist.search_from_tail(17)
print(result) # False
# 문제3 테스트
double_linkedlist.insert_before(6.5, 7)
double_linkedlist.node_print() # 0 1 2 3 4 5 6 6.5 7 8 9 10
'파이썬 > 파이썬 자료구조와 알고리즘' 카테고리의 다른 글
파이썬 자료구조 (6) 트리 (0) | 2024.10.17 |
---|---|
파이썬 자료구조 (5) 해시 테이블 (1) | 2024.10.16 |
파이썬 자료구조 (3) 링크드리스트 (0) | 2024.10.16 |
파이썬 자료구조 (2) 큐와 스택 (0) | 2024.10.16 |
파이썬 자료구조 (1) 배열 (0) | 2024.10.16 |