자료구조
자료구조3 - 연결 리스트 예제
토리쟁이
2022. 7. 11. 11:45
자료구조2에서는 연결 리스트의 기본적인 기능을 구현해보았다.
이번 자료구조3에서는 연결 리스트를 이용한 2가지 예제에 대한 풀이를 진행하도록 하겠다.
(예제 문제는 엘리스 아카데미를 참고함)
class node: # 연결 리스트를 구현할 노드 생성
def __init__(self, data, ptr):
node.data = data # 노드의 데이터를 초기화
node.next = ptr # 노드의 다음 노드를 가리키는 포인터를 초기화
class linkedpipe:
def __init__(self): # 연결 리스트 초기화
self.start = None # 연결 리스트의 시작점은 아직 정해지지 않음
self.end = None # 연결 리스트의 끝점도 아직 정해지지 않음
def addLeft(self, n): # 왼쪽에 노드 추가
if self.start is None and self.end is None: # 노드가 아예 없을 경우
self.start = node(n, None) # 시작노드와 끝노드를 새롭게 추가하는 노드로 변경
self.end = node(n, None)
else:
new = node(n, self.start) # 시작노드를 가리키는 n값의 노드를 추가
self.start = new # 시작노드가 새롭게 추가한 노드가 됨
def addRight(self, n): # 오른쪽에 노드 추가
if self.start is None and self.end is None:
self.start = node(n, None)
self.end = node(n, None)
else:
self.end.next = node(n, None) # 가장 마지막 노드가 새롭게 만든 노드를 가리키도록-
self.end = node(n, None) #가장 마지막 노드를 새롭게 만든 노드로 초기화
def getBeads(self): # 구슬의 위치를 리스트로 반환하는 함수
beads = []
current = self.start #첫 번째 구슬부터 시작
while current: # 노드가 존재할 때까지 계속
beads.append(current.data) # 리스트에 구슬을 추가
current = current.next # 다음 노드로 이동
return beads # 리스트를 반환
class LinkedListElement : #노드를 정의하는 클래스
def __init__(self, data, myPrev, myNext) :
self.data=data
self.myPrev=myPrev
self.myNext=myNext
class orderManager : #주문
def __init__(self) :
self.start=None
self.end=None
def addOrder(self, orderId) :
order=LinkedListElement(orderId, None,None)
if self.start==None and self.end==None: #만약 연결리스트에 아무 것도 없다면
self.start=order
self.end=order
else:
self.end.myNext=order #맨 마지막 노드가 가리키는 곳에 주문 추가
order.myPrev=self.end
self.end=order #맨 마지막 노드를 새롭게 추가한 주문으로 초기화
def removeOrder(self, orderId) :
if self.start==None and self.end==None:
return
else:
current=self.start #연결리스트의 처음 노드부터 탐색 시작
while current != None:
if current.data==orderId:
predata=current.myPrev
nextdata=current.myNext
if predata !=None:
predata.myNext=nextdata
if nextdata !=None:
nextdata.myPrev=predata
if current == self.end: #삭제하려는 주문이 맨 마지막 주문일 경우
self.end=predata #이중연결리스트의 마지막 주문을 이전 주문으로 바꿔주어야함
if current == self.start: #삭제하려는 주문이 맨 앞 주문일 경우
self.start=nextdata #이중연결리스트의 맨 앞 주문을 다음 주문으로 바꿔주어야함
current=current.myNext #다음 노드로 이동
def getOrder(self, orderId) :
cnt=0
current = self.start
if self.start==None and self.end==None:
return -1
else:
while current != None:
cnt+=1
if current.data == orderId:
return cnt
else:
current=current.myNext
return -1