
연결 리스트 구조
- 연결리스트는 떨어진 곳에 존재하는 데이터를 화살표로 연결해서 관리하는 데이터 구조이다.
- 배열은 순차적으로 연결된 공간에 데이터를 나열하는 데이터 구조이다.
연결 리스트 장단점
- 장점
- 단점
- 연결을 위한 별도 데이터 공간이 필요하므로, 저장공간 효율이 높지는 않다.
- 연결 정보를 찾는 시간이 필요하므로 접근 속도가 느리다.
- 중간 데이터 삭제시, 앞뒤 데이터의 연결을 재구성해야 하는 부가적인 작업이 필요하다.
연결 리스트 용어
- 노드(Node) : 데이터 저장 단위로 구성되어있다.(데이터 값, 포인터)
- 포인터(Pointer) : 각 노드 안에서, 다음이나 이전의 노드 주소를 가지고 있는 공간이다.
연결 리스트 구현
노드 구현
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
연결 리스트에 맨 마지막에 데이터 추가하기
def add(data):
node = head
while node.next:
node = node.next
node.next = Node(data)
연결 리스트 데이터 검색하기
def findNode(data):
count = 0
node = head
while node:
count += 1
if node.data == data:
print("{}번 째 노드에 있습니다. 값은 {}입니다." .format(count, node.data))
return node
else:
node = node.next
연결 리스트 사이에 데이터 추가하기
def addNodeInside(data, pre_node_data):
node = head
new_Node = Node(data)
pre_node = findNode(pre_node_data)
if pre_node == None:
return print("해당 값을 가진 노드가 존재하지 않습니다.")
elif pre_node.next == None:
pre_node.next = new_Node
else:
new_Node.next = pre_node.next
pre_node.next = new_Node
연결 리스트 전체 출력
def printAll():
node = head
while node:
print(node.data)
node = node.next
연결 리스트 노드 삭제
- head 노드 삭제
- 맨 마지막 노드 삭제
- 중간 노드 삭제
def deleteNode(data):
if head == None:
print("해당 값을 가진 노드가 존재하지 않습니다.")
if head.data == data:
temp = self.head
head = head.next
del temp
else:
node = head
while node.next:
if node.next.data == data:
temp = node.next
node.next = node.next.next
del temp
else:
node = node.next
테스트 해보기
node1 = Node(1)
head = node1
for index in range(2, 11):
add(index)
printAll()
findNode(4)
addNodeInside(12, 4)
printAll()
deleteNode(4)
printAll()
클래스에서 전체 구현
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 addLastNode(self, data):
if self.head == None:
self.head = Node(data)
if self.head.next == None:
self.head.next = Node(data)
else:
node = self.head
while node.next:
node = node.next
node.next = Node(data)
def addNodeInside(self, data, pre_node_data):
if self.head == None:
self.head = Node(data)
new_node = Node(data)
pre_node = self.findNode(pre_node_data)
if pre_node == None:
return print("해당 값을 가진 노드가 존재하지 않습니다.")
elif pre_node.next == None:
pre_node.next = new_node
else:
new_node.next = pre_node.next
pre_node.next = new_node
def findNode(self, data):
if self.head == None:
return None
else:
node = self.head
while node:
if node.data == data:
return node
else:
node = node.next
return None
def deleteNode(self, data):
if self.head == None:
print("리스트가 비어있습니다.")
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
else:
node = node.next
def printAll(self):
node = self.head
while node:
print(node.data)
node = node.next