알고리즘/이론정리
연결리스트 연습문제
팽팽
2021. 9. 9. 17:07
연결리스트에 관한 삽입 삭제 순회의 함수들을 모두 구현한 것이다.
문제는 popAt()함수를 구현하는 것이었다.
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 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 popAt(self, pos):
if pos < 1 or pos > self.nodeCount:
raise IndexError
curr = self.getAt(pos)
prev = self.getAt(pos-1)
if self.nodeCount == 1: #유일한 노드 삭제
self.head = None
self.tail = None
else:
if pos == 1: #첫번째꺼 삭제
self.head = curr.next
elif pos == self.nodeCount: # 맨끝에꺼 삭제
self.tail = prev
prev.next = None
else: #맨끝이 아닌경우
prev.next = curr.next
self.nodeCount -= 1
return curr.data
def traverse(self):
result = []
curr = self.head
while curr is not None:
result.append(curr.data)
curr = curr.next
return result
def solution(x):
return 0
처음 시작할 때 indexAt함수를 변형했다.
삽입 할 때와 달리 연결리스트에서 유일한 노드를 삭제할 때는 또 다른 IF문으로 처리를 해줘야했다.
그래..여기까진 맞았어
자꾸 맞는것 같은데 오류가 나서 매우 답답했음...
이유가 뭐였냐면
1. nodeCount 처리
삽입할때랑 삭제할 때의 경우를 잘 생각해보지 않았다. (insertAt 그냥 갖다 쓰다보니 ...)
2. 대입 문제
멍청하게 거꾸로 대입하고 있었다....
pos == 1 일때 self.head = curr.next 가 아니라 반대로 대입문을 작성했음 ㅜ
def popAt(self, pos):
if pos < 1 or pos > self.nodeCount:
raise IndexError
curr = self.getAt(pos)
prev = self.getAt(pos-1)
if self.nodeCount == 1: #유일한 노드 삭제
self.head = None
self.tail = None
else:
if pos == 1: #첫번째꺼 삭제
self.head = curr.next
elif pos == self.nodeCount: # 맨끝에꺼 삭제
self.tail = prev
prev.next = None
else: #맨끝이 아닌경우
prev.next = curr.next
self.nodeCount -= 1
return curr.data