class Node:
def __init__(self, data):
self.data = data
self.next = None
def __str__(self):
return self.data.__str__()
class LinkedList:
def __init__(self):
self.nodeCount = 0
self.head = Node(None)
self.tail = None
self.head.next = self.tail
def traverse(self):
result = []
curr = self.head
while curr.next:
curr = curr.next
result.append(curr.data)
return result
def __str__(self):
return self.traverse().__str__()
def __getitem__(self, idx):
if 0 <= idx < self.nodeCount:
node = self.head.next
for _ in range(idx):
node = node.next
return node
else:
raise IndexError
def insertAfter(self, prev, newNode):
newNode.next = prev.next
prev.next = newNode
if newNode.next is None:
self.tail = newNode
self.nodeCount += 1
def insertAt(self, idx, newNode):
if 0<= idx < self.nodeCount + 1:
if idx == 0 :
prev = self.head
else:
prev = self[idx-1]
return self.insertAfter(prev, newNode)
else:
raise IndexError
def popAfter(self, prev):
curr = prev.next
prev.next = curr.next
if curr.next is None:
self.tail = prev if prev is not self.head else None
self.nodeCount -= 1
return curr.data
def popAt(self, idx):
if 0 <= idx < self.nodeCount:
if idx == 0 :
prev = self.head
else:
prev = self[idx-1]
return self.popAfter(prev)
else:
raise IndexError
def concat(self, other):
if self.tail:
self.tail.next = other.head.next
else:
self.head.next = other.head.next
if other.tail:
self.tail = other.tail
self.nodeCount += other.nodeCount
소스코드 : LinkedList.py