今天写了一个用Python实现单链表,基本功能包括:从头插入,从尾插入,查找,删除,构造有限队列的插入等功能。
# -*- coding: utf-8 -* ##允许中文注释
'''
单向链表的Python实现
L = LinkList()
L.addToHead ##从头节点加入数据
L.addToTail ##从尾节点加入数据
L.findTail ##返回尾节点
L.findSize ##返回链表大小
L.delete(data) ##删除指定节点
L.search(index) ##返回指定index的节点
L.clear() ##清空链表
author: diudiu
'''
class Node():
def __init__(self, data = None, next = None):
self.data = data
self.next = next
def __str__(self):
return 'Node [' + str(self.data) + ']'
class LinkList():
def __init__(self):
self.head = None
#self.tail = None #也可以设置一个tail,这样就不需要调用findTail()函数去找尾巴了
self.size = 0
def __str__(self):
newNode = self.head
s = ''
while newNode:
s += str(newNode.data)
if newNode.next:
s += ','
newNode = newNode.next
return s
def addToHead(self, data):
newNode = Node(data, None)
if self.head == None:
self.head = newNode
else:
newNode.next = self.head
self.head = newNode
self.size += 1
def addToTail(self, data):
newNode = Node(data, None)
if self.head == None:
self.head = newNode
else:
tail = self.findTail()
tail.next = newNode
self.size += 1
def findTail(self):
curNode = self.head ##currentNode = self.head
while curNode.next:
curNode = curNode.next
return curNode
def findSize(self):
return self.size
def delete(self, data):
if self.size == 0:
print "Can not delete from an empty list"
return
curNode = self.head
preNode = None
while curNode:
if curNode.data == data:
break
else:
preNode = curNode
curNode = curNode.next
if curNode == self.head:
self.head = self.head.next
elif curNode == None:
print 'Cant find the data you want delete'
else:
preNode.next = curNode.next
curNode = None
self.size -= 1
def insert(self, data):##将构造一个有限队列
newNode = Node(data, None)
if self.size == 0:
self.head = newNode
else:
curNode = self.head
preNode = None
while curNode:
if curNode.data >= data:
break
else:
preNode = curNode
curNode = curNode.next
if curNode == self.head:
newNode.next = self.head
self.head = newNode
else:
newNode.next = curNode
preNode.next = newNode
self.size += 1
pass
def search(self, index):
if self.size == 0:
print "the list is empty"
return
if index > self.size:
print "the index is out of boundary"
return
curNode = self.head
cnt = 1
while curNode:
if cnt == index:
return curNode
cnt += 1
curNode = curNode.next
def clear(self):
self.__init__()
def test():
L = LinkList()
while 1:
data = raw_input('input data, input "q" to stop: ')
if data == 'q':
break
L.insert(data)
print L
index = raw_input('input the index:')
print L.search(int(index))
while 1:
data = raw_input('delete data, input "q" to stop: ')
if data == 'q':
break
L.delete(data)
print L
if __name__ == "__main__":
test()