Programming/Data Structure
링크드리스트
홍열
2020. 10. 29. 08:39
728x90
연결리스트
1. 링크드리스트 구조
- 링크드리스트는 떨어진 곳을 존재하느 데이터를 포인터로 가르켜서 관리하는 구조
- C언어에서는 포인터를 사용하여 다음 주소를 가르키도록 하지만, python에서는 객제지향을 가지고 구현
- 링크드리스트의 기본 용어
노드(Node) : 데이터의 기본 저장 단위(데이터값, 포인터)로 구성
포인터(Pointer) : 각 노드안에서 다음 Node와의 연결정보를 가지고 있음
2. Python으로 구현한 링크드 리스트
class Node:
def __init__(self, data, next=None):
self.data = data
delf.next = next
node1 = Node(1)
node2 = Node(2)
node1.next = node2
tNode = node1
while tNode.next:
print(tNode.data)
VisuAlgo - Linked List (Single, Doubly), Stack, Queue, Deque
VisuAlgo is free of charge for Computer Science community on earth. If you like VisuAlgo, the only payment that we ask of you is for you to tell the existence of VisuAlgo to other Computer Science students/instructors that you know =) via Facebook, Twitter
visualgo.net
3. 장점 / 단점
- 장점
미리 데이터 공간을 할당할 필요가 없다.
배열은 미리 데이터 공간을 할당 해야한다.
- 단점
다음 노드를 위한 별도의 공간이 필요하다.
배열은 인덱스로 바로 접근 가능한 반면 링크드리스트는 맨 앞에서부터 접근 해야한다.
접근 속도가 느리다.
중간 데이터 삽입,삭제시에 데이터 연결을 재설정해야된다.
파이썬 객체지향 프로그래밍으로 링크드리스트 구현하기
class Node:
def __init__(self, data, next=None):
self.data = data
self.next = next
class NodeManager:
def __init__(self, data):
self.head = Node(data)
#출력
def desc(self):
if self.head == None:
print("no head")
return
node = self.head
while node:
print(node.data)
node = node.next
#추가
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 delete(self, data):
#헤드일경우
if self.head == '':
print("no head")
return
if self.head.data == data:
temp = self.head
self.head = self.head.next
del temp
print('delete head')
return
else: #헤드가 아닐 경우
print('delete not head')
node = self.head
while node.next:
if node.next.data == data:
temp = node.next
node.next = node.next.next
del temp
return
else:
node = node.next
#찾기 함수
def find(self, data):
if self.head == None:
print("not node")
return
if self.head == '':
print("not head")
return
node = self.head
while node.next:
if node.data == data:
print("find data")
return
else:
node = node.next
linked = NodeManager(1)
for data in range(2, 10):
linked.add(data)
linked.desc()
linked.find(10)
이중 링크드리스트
class Node:
def __init__(self, data, prev=None, next=None):
self.data = data
self.prev = prev
self.next = next
class NodeManager:
def __init__(self, data):
self.head = Node(data)
self.tail = self.head
# 하나만 넣어볼 경우
def insert(self, data):
if self.head == None:
self.head = Node(data)
else:
node = self.head
while node.next:
node = node.next
new = Node(data)
node.next = new
new.prev = node
self.tail = new
#특정 위치앞에 삽입
def insert_from_before(self, data, before):
if self.head == None:
self.head = Node(data)
self.tail = self.head
return True
else:
node = self.tail
while node.data != before:
node = node.prev
if node == None:
return False
# 하나 앞의 노드를 기억해두고
before_node = node.prev
# 새로운 노드를 만들때 위치를 지정해준다
new = Node(data, before_node, node)
if before_node: #전의 노드의 위치를 new로 바꿔준다.
before_node.prev = new
else:
self.head = new
node.prev = new
return True
#특정 위치 뒤에 삽입
def insert_from_after(self, data, after):
if self.head == None:
self.head = Node(data)
self.tail = self.head
return True
else:
node = self.head
while node.data != after:
node = node.next
if node == None:
return False
next_node = node.next
new = Node(data, node, next_node)
if new:
next_node.prev = new
else:
self.tail = new
def desc(self):
node = self.head
while node:
print(node.data)
node = node.next