링크드리스트(연결리스트)
- 배열은 연결된 공간의 크기를 미리 지정해놓아야 사용 할 수 있으며 그 크기를 변경할 수 없다. 따라서 데이터를 추가/삭제 하기가 어렵다.
- 링크드리스트는 이런 문제점을 해결 할 수 있다.
- 노드(데이터+포인터)로 구성됨
- 포인터가 다음 노드의 주소값을 참고한다
- 단점 :
연결을 위한 별도의 공간(포인터)가 필요하므로 저장공간 효율이 높지 않음
연결 정보를 찾는 시간이 필요하므로 접근 속도가 느림
중간 데이터 삭제 시, 앞뒤 데이터의 연결을 재구성 해야함
파이썬으로 링크드리스트 구현해보기
class Node:
def __init__(self,data,next=None):
self.data=data
self.next=next
node1=Node(1)
node2=Node(2)
node1.next=node2
head=node1
class Node:
def __init__(self,data,next=None):
self.data=data
self.next=next
def add(data):
node = head
while node.next:
node = node.next
node.next=Node(data)
node1 = Node(1)
head = node1
for i in range(2,10):
add(i)
node = head
while node.next:
print(node.data)
node=node.next
print(node.data)
링크드리스트 사이에 데이터 추가
node = head
while node.next:
print(node.data)
node=node.next
print(node.data)
node3 = Node(1.5)
node = head
search = True
while search:
if node.data==1:
search=False
else:
node=node.next
push_out_node = node.next
node.next=node3
node3.next=push_out_noe
파이썬 객체지향 프로그래밍으로 링크드리스트 구현하기
Class Node:
def __init__(self,data,next=None):
self.data=data
self.next=next
Class NodeMgmt:
def __init__(self,data):
self.head=Node(data)
def add(self,data):
if self.head='':
self.head=Node(data)
else:
node=self.head
while node.next:
node=node.next
node.next=Node(data)
def desc(self):
node=self.head
while node:
print(node.data)
node=node.next
링크드리스트 특정 노드 삭제 구현
def delete(self,data):
if self.head=='':
print("해당 값을 가진 노드가 없습니다")
return
if self.head.data==data:
deleted_soon = self.head
self.head=self.head.next
del deleted_soon
else:
node=self.head
while node.next:
if node.next.data==data
delete_soon = node.next
node.next=node.next.next
del delete_soon
return
else:
node=node.next
노드 데이터가 특정 숫자인 노드를 찾는 함수 만들기
def search_node(self,data):
node=self.head
while node:
if node.data==data:
return node
else:
node=node.next
더블 링크드리스트
- 링크드리스트는 맨 첫 노드부터 찾을 수 밖에 없음
- 내가 원하는 데이터가 8000번째 데이터라면?
- 1번 노드부터 8000번 노드까지 8000번 데이터를 찾아봐야함
- 더블 링크드리스트 : 양방향으로 연결되어 있어서 노드 탐색이 양쪽으로 가능
- 내가 원하는 데이터가 뒷쪽에 있으면 뒤쪽 부터 데이터 탐색 가능
class Node:
def __init__(self,data,prev=None,next=None):
self.data=data
self.prev=prev
self.next=next
class NodeMgmt:
def __init__(self,data):
self.head=Node(data)
self.tail=self.head
def insert(self,data):
if self.head='':
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 desc(self):
node=self.head
while node:
print(node.data)
node=node.next
def search_from_head(self,data):
if self.head=='':
return False
else:
node=self.head
while node:
if node.data==data
return node
else:
node=node.next
return False
def search_from_tail(self,data):
if self.tail=='':
return False
else:
node=self.tail
while node:
if node.data==data
return node
else:
node=node.prev
return False
def insert_from_tail(self,new_data,before_data):
if self.head==None:
self.head=Node(data)
self.tail=self.head
return True
else:
node=self.tail
while node.data!=before_data:
node=node.prev
if node==None:
return False
new = Node(new_data)
bofore_new=node.prev
new.prev=bofore_new
before_new.next=new
new.next=node
node.prev=new
return True
def insert_from_head(self,new_data,after_data):
if self.head==None:
self.head=Node(data)
self.tail=self.head
return True
else:
node = self.head
while node.data!=after_data:
node=node.next
if noee.next==None:
return False
new = Node(new_data)
after_new = node.next
new.prev=node
new.next=after_new
node.next=new
after_new.prev=new
if new.next==None:
self.tail=new
return True