Single-linked List Algorithm (in Python)
简易单链表算法,携Sample Test部分
class SLinkedListNode:
def __init__(self, initData, initNext):
self.data = initData
self.next = initNext
def getNext(self):
return self.next
def getData(self):
return self.data
def setData(self, newData):
self.data = newData
def setNext(self, newNext):
self.next = newNext
class SLinkedList:
def __init__(self):
self.head = None
self.size = 0
def add(self, item):
new_node = SLinkedListNode(item, None)
new_node.setNext(self.head)
self.head = new_node
self.size += 1
def append(self, item):
new_node = SLinkedListNode(item, None)
current = self.head
if self.size == 0:
self.add(item)
else:
while (current.getNext() != None):
current = current.getNext()
current.setNext(new_node)
self.size += 1
def insert(self, pos, item):
assert isinstance(pos, int)
assert pos >= 0
if self.size == 0:
self.add(item)
else:
new_node = SLinkedListNode(item, None)
current = self.head
if self.getSize() <= pos:
self.append(item)
elif pos == 0:
new_node.setNext(self.head)
self.head = new_node
self.size += 1
else:
index = 0
while index < (pos - 1):
current = current.getNext()
index += 1
old_next = current.getNext()
current.setNext(new_node)
new_node.setNext(old_next)
self.size += 1
def remove(self, item):
if self.size == 0:
raise Exception('List is Empty')
current = self.head
previous = None
found = False
while current != None and not found:
if current.getData() == item:
found = True
else:
previous = current
current = current.getNext()
if not found:
raise Exception('Item not in list')
else:
if previous == None:
self.head = current.getNext()
else:
previous.setNext(current.getNext())
self.size = self.size - 1
def index(self, item):
if self.size == 0:
raise Exception('List is empty')
position = 0
found = False
current = self.head
while current != None and not found:
if current.getData() == item:
found = True
else:
current = current.getNext()
position = position + 1
if found:
return position
else:
return 'Item not found'
def pop(self):
if self.size == 0:
raise Exception('List is empty')
current = self.head
previous = None
while current.getNext() != None:
previous = current
current = current.getNext()
if previous == None:
self.head = None
else:
previous.setNext(None)
self.size = self.size - 1
return current.getData()
def __str__(self):
current = self.head
string = ''
while current != None:
string = string + str(current.getData())+'->'
current = current.getNext()
return string
def getSize(self):
return self.size
def main():
slist = SLinkedList()
slist.add(2)
slist.add(4)
slist.add('A')
slist.append(77)
slist.append(6)
slist.append('Z')
print('Original List:', slist.getSize(), 'elements')
print(slist)
print()
slist.insert(0, 'start')
print('After inserting the word start at position 0:', slist.getSize(), 'elements')
print(slist)
print()
slist.insert(7, 'end')
print('After inserting the word end at position 7:', slist.getSize(), 'elements')
print(slist)
print()
slist.insert(4, 'middle')
print('After inserting middle at position 4:', slist.getSize(), 'elements')
print(slist)
if __name__=="__main__":
main()