이중 연결 리스트는 이전 노드를 가리키는 포인터, 다음 노드를 가리키는 포인터를 가지고 있다.
양방향으로 연결되어 있어 노드를 탐색하는데 있어 양쪽 모두 가능하다.
이중 연결 리스트 실습 - 노드 삽입
class Node:
# 이전 노드를 가리키는 prev, 다음 노드를 가리키는 next
def __init__ (self,data,prev=None,next=None):
self.prev = prev
self.data = data
self.next = next
class NodeModule:
def __init__ (self,data):
self.head=Node(data)
self.tail = self.head
def add(self,data):
# node에 head가 없다면
if self.head == None:
self.head = Node(data)
self.tail = self.head
else:
# node에 포인터가 head를 가리키게하고
node = self.head
# node에 끝으로 이동
while node.next:
node = node.next
# 새로운 노드 데이터를 삽입
new = Node(data)
# node의 끝 데이터에 다음 노드를 새로 삽입한 노드를 연결
node.next = new
# 새로 삽입한 노드를 이전 노드와 연결
new.prev = node
# 새로 삽입한 노드는 끝에 있기 때문에 self.tail = new
self.tail = new
def show(self):
node = self.head
while node:
print(node.data)
node=node.next
이중 연결 리스트 실습 - 특정 위치에 노드삽입
class Node:
# 이전 노드를 가리키는 prev, 다음 노드를 가리키는 next
def __init__ (self,data,prev=None,next=None):
self.prev = prev
self.data = data
self.next = next
def search_data(self, num):
if self.head == None:
return False
node = self.head
while node:
if float(node.data) == float(num):
return node
else:
node=node.next
class NodeModule:
def __init__ (self,data):
self.head = Node(data)
self.tail = self.head
# 입력한 data가 node에 있는지 확인
def add(self,data,num,pn):
# node에 head가 없다면
if self.head == None:
self.head = Node(data)
self.tail = self.head
else:
# 입력한 특정 데이터가 node에 있는지 확인
node = search_data(self,num)
# 입력한 특정 데이터가 node에 있다면
if node:
# 특정 노드 앞에 추가
if int(pn) == 1:
# 삽입할 노드 생성
new = Node(data)
# 특정 노드의 이전포인터 저장
before_data = node.prev
# 특정 노드의 이전포인터가 없다면 그건 head 노드이다
if before_data == None:
self.head = new
else:
# 특정 노드의 이전포인터가 새로 삽입할 노드를 가리킴
before_data.next = new
# 새로 삽입한 노드는 이전 노드를 가리킴
new.prev = before_data
# 특정 노드의 이전포인터는 새로 삽입한 노드를 가리켜야함
node.prev = new
# 새로 삽입한 노드는 특정 노드를 가리켜야함
new.next = node
# 특정 노드 뒤에 추가
elif int(pn) == 2:
# 삽입할 노드 생성
new = Node(data)
# 특정 노드의 다음포인터 저장
after_data = node.next
# 특정 노드의 다음포인터가 없다면 그건 tail노드이다
if after_data == None:
self.tail = new
else:
# 특정노드의 다음노드는 새로 삽입한 노드를 가리켜야함
after_data.prev = new
# 새로 삽입한 노드는 특정노드의 다음노드를 가리켜야함
new.next = after_data
# 특정 노드의 다음포인터를 새로 삽입한 노드를 가리킴
node.next = new
# 새로 삽입한 노드는 특정노드를 가리켜야함
new.prev = node
else:
print("잘못된 값 입력!")
return
# 입력한 데이터가 node에 없다면
else:
print("입력한 데이터가 node에 없습니다.")
return
def show(self):
node = self.head
print(f"node data : ",end='')
while node:
print(f" {node.data} ", end='')
node=node.next
print("\n")
no=NodeModule(1)
while True:
no.show()
print("-----------------------------------------------------")
data = input("추가할 데이터 값 입력 - ")
num = input("특정 데이터 선택 - ")
pn = input("1. 특정 데이터 앞에 추가 2. 특정 데이터 뒤에 추가 - ")
no.add(data,num,pn)
print("-----------------------------------------------------")