class Node: # 리스트의 원소인 각 노드
def __init__(self, item):
self.data = item
self.next = None
class LinkedList:
def __init__(self):
self.nodeCount = 0 # 리스트의 총 길이
self.head = None # head node
self.tail = None # tail node
def getAt(self, pos): # 특정 원소 탐색 (k번째) -> O(n)
if pos < 1 or pos > self.nodeCount: # 탐색할 수 없는 노드의 위치일 경우
return None
i = 1
curr = self.head
while i < pos:
curr = curr.next
i += 1
return curr
def traverse(self): # 리스트 순회
answer = []
if self.head == None:
return answer
curr = self.head
while True:
answer.append(curr.data)
if curr.next == None:
break
curr = curr.next
return answer
def getLength(self): # 길이 얻어내기
return self.nodeCount
def insertAt(self, pos, newNode): # 특정 원소 삽입
if pos < 1 or pos > self.nodeCount + 1: # 삽입할 수 없는 노드의 위치일 경우
return False
if pos == 1: # O(1)
newNode.next = self.head
self.head = newNode
else:
# O(1) - 만약 tail포인터가 없었다면 가장 오래 걸리는 연산이었었다.
if pos == self.nodeCount + 1:
prev = self.tail
self.tail = newNode
else: # O(n)
prev = self.getAt(pos-1)
newNode.next = prev.next
prev.next = newNode
self.nodeCount += 1
return True
def popAt(self, pos): # 특정 원소 삭제
if pos < 1 or pos > self.nodeCount: # 삭제할 수 없는 노드의 위치일 경우
raise IndexError
curr = None
if pos == 1: # O(1)
curr = self.head
if self.nodeCount == 1:
self.head = None
self.tail = None
else:
self.head = curr.next
else: # O(n)
prev = self.getAt(pos-1)
curr = prev.next
if pos == self.nodeCount:
prev.next = None
self.tail = prev
else:
prev.next = curr.next
self.nodeCount -= 1
return curr.data
def concat(self, L): # 두 리스트 합치기
self.tail.next = L.head
if L.nodeCount: # 합치는 리스트가 비어있을 경우
self.tail = L.tail
self.nodeCount += L.nodeCount
댓글남기기