728x90
반응형
리스트(List)
- 데이터 요소들을 순서대로 저장하는 자료구조이다.
- 배열 또는 동적 배열로 구현될 수 있다.
- 인덱스를 사용하여 각 요소에 접근할 수 있다.
# 리스트
from typing import Any
class List:
def __init__(self,size:int)->None:
self.size = size
print(f"{self.size} 크기의 리스트 생성!")
self.__container = [None] * self.size
def getter(self,index:int)->Any: return self.__container[index]
def setter(self,item:Any,index:int)->None : self.__container[index] = item
def add(self,item:Any,index:int)->None:
self.__container[index] = item
def remove(self,index:int)->None:
self.__container[index] = None
def showAll(self)->None:
print("---------------List---------------")
print(self.__container)
l = List(10)
l.showAll()
l.add("hello",2)
l.showAll()
연결 리스트(Linked List)
- 데이터 요소들을 노드(Node)라는 개별적인 단위로 저장하는 자료구조 이다.
- 각 노드는 데이터와 다음 노드를 가리키는 포인터로 이루어져 있다.
- 메모리 상에서 각 노드가 연속적으로 위치하지 않고, 흩어져 있을 수 있다.
- 데이터의 추가, 삭제가 비교적 쉽고 빠르지만, 임의의 위치에 직접 접근하기 어렵다.
# 연결 리스트
from typing import Any
# 노드
class Node:
def __init__(self,item:Any,next:Any)->None:
self.__item = item # 저장할 값
self.__next = next # 다음 노드
def getItem(self)->Any: return self.__item
def getNode(self)->Any: return self.__next
def setItem(self,item:Any)->None: self.__item = item
def setNode(self,next:Any)->None: self.__next = next
def __del__(self) : print("노드 삭제!")
class LinkedList:
def __init__(self)->None:
self.head = None
self.cur = None
def add(self,item:Any)->None:
if self.head == None : # 아무것도 없는 상태
self.head = Node(item,None)
self.cur = self.head
else :
self.cur.setNode(Node(item,None))
self.cur = self.cur.getNode()
def __search(self,key:Any)->Node:
next = self.head
target = None
prTarget = None
while True:
if next == None:
break
elif next.getNode() != None and next.getNode().getItem() == key:
target = next.getNode()
prTarget = next
break
next = next.getNode()
if target != None:
return target,prTarget
else:
return -1,None
def remove(self,key)->None:
t,p = self.__search(key)
if t == -1:
print("값이 리스트에 없습니다.")
else :
p.setNode(t.getNode())
del t
def showAll(self)->None:
next = self.head
while True:
if next.getNode() == None:
print(next.getItem())
break
else:
print(f"{next.getItem()} -> ", end='')
next = next.getNode()
l = LinkedList()
l.add(10)
l.add(20)
l.add(30)
l.add(60)
l.add(40)
l.showAll()
l.remove(70)
l.remove(30)
l.showAll()
"""
10 -> 20 -> 30 -> 60 -> 40
값이 리스트에 없습니다.
노드 삭제!
10 -> 20 -> 60 -> 40
"""
이중 연결 리스트(Doubly Linked List)
- 연결 리스트의 한 종류로, 각 노드가 다음 노드 뿐만 아니라 이전 노드를 가리키는 포인터를 가진다.
- 양방향 탐색이 가능하다.
- 데이터의 추가, 삭제, 탐색이 상대적으로 유연하게 이루어진다.
- 각 노드마다 이전 노드를 가리키는 포인터가 추가적으로 필요하므로 메모리 사용량이 증가한다.
# 이중 연결 리스트
from typing import Any
class Node:
def __init__(self,item:Any,next:Any)->None:
self.__item = item
self.__pre = None
self.__next = None
def getItem(self)->Any : return self.__item
def setItem(self,item:Any)->None : self.__item = item
def getPre(self)->Any : return self.__pre
def setPre(self,pre:Any)->None : self.__pre = pre
def getNext(self)->Any : return self.__next
def setNext(self,next:Any)->None : self.__next = next
def __del__(self) : print("노드 삭제!")
class DoublyLinkedList:
def __init__(self):
self.head = None
self.cur = None
def add(self,item:Any)->None:
if self.head == None : # 아무것도 없는 상태
self.head = Node(item,None)
self.cur = self.head
else :
self.cur.setNext(Node(item,None))
self.cur = self.cur.getNext()
def __search(self,key:Any)->Node:
next = self.head
target = None
prTarget = None
while True:
if next == None:
break
elif next.getNext() != None and next.getNext().getItem() == key:
target = next.getNext()
prTarget = next
break
next = next.getNext()
if target != None:
return target,prTarget
else:
return -1,None
def remove(self,key)->None:
t,p = self.__search(key)
if t == -1:
print("값이 리스트에 없습니다.")
else :
p.setNext(t.getNext())
del t
def showAll(self)->None:
next = self.head
while True:
if next.getNext() == None:
print(next.getItem())
break
else:
print(f"{next.getItem()} <-> ", end='')
next = next.getNext()
dl = DoublyLinkedList()
dl.add(10)
dl.add(20)
dl.add(30)
dl.add(60)
dl.add(40)
dl.showAll()
dl.remove(70)
dl.remove(30)
dl.showAll()
728x90
반응형
'CS > 자료구조 및 알고리즘' 카테고리의 다른 글
[알고리즘] BFS, DFS (0) | 2023.06.30 |
---|---|
[자료구조] 트리 (0) | 2023.06.30 |
[알고리즘] 문자열 검색 (0) | 2023.06.29 |
[알고리즘] 정렬 (0) | 2023.06.28 |
[알고리즘] 재귀 (0) | 2023.06.27 |