지난번에 연결리스트의 getAt 메소드까지 구현을 해보았다. 이번에는 더 다양한 연산을 구현해보려고 한다!
def insertAt(self, pos, newNode):
insertAt 구현
1. newNode의 뒤쪽 노드 조정: prev.next(pos번째 노드)를 newNode가 가리키도록 조정한다.
2. 앞선(prev) 노드가 newNode를 가리키도록 한다. newNode를 prev.next가 가리키도록 조정한다.
3. nodeCount + 1
1번과 2번이 바뀌면 안된다.
def insertAt(self, pos, newNode):
prev = self.getAt(pos-1)
newNode.next = prev.next
prev.next = newNode
self.nodeCount += 1
코드 구현 시 주의사항
(1) 삽입하려는 위치가 리스트 맨 앞일 때,
(2) 삽입하려는 위치가 리스트 맨 끝일 때,
(3) 빈 리스트에 삽입 시
-> 위 두조건에 의해 처리된다.
def insertAt(self, pos, newNode):
if pos < 1 or pos > self.nodeCount + 1:
return False
if pos = 1 :
newNode.next = self.head
self.head = newNode
else:
prev = self.getAt(pos - 1_
newNode.next = prev.next
preve.next = newNode
if pos == self.nodeCount + 1:
self.tail = newNode
self.nodeCount += 1
return True
추가 조정 사항
def insertAt(self, pos, newNode):
if pos < 1 or pos > self.nodeCount + 1:
return False
if pos = 1 :
newNode.next = self.head
self.head = newNode
else:
if pos == self.nodeCount + 1:
prev = self.tail
else:
prev = self.getAt(pos - 1_
newNode.next = prev.next
preve.next = newNode
if pos == self.nodeCount + 1:
self.tail = newNode
self.nodeCount += 1
return True
최종 총 코드 (모든 메소드)
class Node:
def __init__(self, item):
self.data = item
self.next = None
class LinkedList:
def __init__(self):
self.nodeCount = 0
self.head = None
self.tail = None
def __repr__(self):
if self.nodeCount == 0:
return 'LinkedList: empty'
s = ''
curr = self.head
while curr is not None:
s += repr(curr.data)
if curr.next is not None:
s += ' -> '
curr = curr.next
return s
def getAt(self, pos):
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 insertAt(self, pos, newNode):
if pos < 1 or pos > self.nodeCount + 1:
return False
if pos == 1:
newNode.next = self.head
self.head = newNode
else:
if pos == self.nodeCount + 1:
prev = self.tail
else:
prev = self.getAt(pos - 1)
newNode.next = prev.next
prev.next = newNode
if pos == self.nodeCount + 1:
self.tail = newNode
self.nodeCount += 1
return True
def getLength(self):
return self.nodeCount
def traverse(self):
result = []
curr = self.head
while curr is not None:
result.append(curr.data)
curr = curr.next
return result
def concat(self, L):
self.tail.next = L.head
if L.tail:
self.tail = L.tail
self.nodeCount += L.nodeCount
a = Node(67)
b = Node(34)
c = Node(28)
L = LinkedList() # empty
L.insertAt(1, a)
L.insertAt(2, b)
L.insertAt(3, c)
연결 리스트 원소 삽입의 복잡도
def popAt(self, pos):
popAt 구현
1. prev.next를 curr.next로 조정
2. curr의 값을 뽑아 return
3. nodeCount -= 1
코드 구현 주의사항
(1) 삭제하려는 node가 맨 앞의 것일 때,
(2) 리스트 맨 끝의 node를 삭제할 때,
(3) 유일한 노드를 삭제할 때,
(4) 삭제하려는 node가 마지막 node일 때, 즉 pos == nodeCount인 경우
연결 리스트 원소 삭제의 복잡도
def concat(self, L):
def concat(self, L):
self.tail.next = L.head
self.tail = L.tail
self.nodeCount += L.nodeCount
코드 구현시 주의할 점
def concat(self, L):
self.tail.next = L.head
if L.tail:
self.tail = L.tail
self.nodeCount += L.nodeCount