배열은 순차적으로 연결된 공간에 데이터를 나열하는 데이터 구조
링크드 리스트는 떨어진 곳에 존재하는 데이터를 화살표로 연결해서 관리하는 데이터 구조
파이썬은 리스트 타입이 링크드 리스트의 기능을 모두 지원함
배열은 사전에 데이터 공간을 할당하고 데이터를 순차적으로 저장
링크드 리스트는 사전에 데이터 공간을 미리 할당하지 않아도 됨
class Node:
def __init__(self, data):
self.data = data
self.next = ""
def add(data):
node = head
# next가 존재하지 않을 때 까지
while head.next:
node = head.next
node.next = Node(data)
head = Node(1)
add(2)
print(head.data) # 1
print(head.next.data) # 2
O(N)
의 시간복잡도를 가짐O(1)
의 시간복잡도를 가짐O(N)
) 삽입 연산을 진행하기 때문O(N)
의 시간복잡도를 가짐O(N)
)삽입과 삭제가 빈번하다면? LinkedList,
데이터 접근이 더 중요하다면? Array
# 노드 클래스 만들기
class Node:
def __init__(self, data, next=None):
self.data = data
self.next = next
# 데이터 생성하기
node1 = Node("seunghye")
node2 = Node("apple")
node3 = Node(1226)
node4 = Node(0.3)
# 데이터 연결하기
node1.next = node2
node2.next = node3
node3.next = node4
# 데이터 출력하기
node = node1
while node:
print(node.data)
# 출력 후 다음으로 넘어가기
node = node.next
📢 출력 결과
🤔 Node를 노드 사이에 추가하고 싶을 때
# 새로운 데이터 생성
node5 = Node("between")
# node2와 node3 사이에 넣어보자
node2.next = node5
node5.next = node3
📢 출력 결과
🤔 객체지향 프로그래밍으로 구현하기
# 노드 클래스 만들기
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
node_mgmt = NodeMgmt(2030)
node_mgmt.desc() # 2030
node_mgmt = NodeMgmt(0)
for data in range(10,21):
node_mgmt.add(data)
node_mgmt.desc()
📢 출력 결과
🤔 노드 지우기
def remove(self, data):
if self.head == "":
print("해당 값을 가진 노드 없음")
return
if self.head.data == data:
temp = self.head
self.head = self.head.next
del temp
else:
node = self.head
while node.next:
if node.next.data == data:
temp = node.next
node.next = node.next.next
del temp
pass
else:
node = node.next
node_mgmt = NodeMgmt(0)
for data in range(1,10):
node_mgmt.add(data)
node_mgmt.remove(5)
node_mgmt.desc()