'''
单链表的实现
'''
class Node(object):
def __init__(self,value=None,next=None):
self.value,self.next = value,next
class LinkedList(object):
def __init__(self,maxsize=None):
self.maxsize = maxsize
self.root = Node()
self.length = 0
self.tailnode = None #代表只有一个根节点
def __len__(self):
return self.length
def append(self,value):
if self.maxsize is not None and len(self) > self.maxsize:
raise Exception('Full')
node = Node(value)
tailnode = self.tailnode
if tailnode is None:
self.root.next = node
else:
tailnode.next = node
self.tailnode = node
self.length += 1
def appendleft(self,value):
headnode = self.root.next
node = Node(value)
self.root.next = node
node.next = headnode
self.length += 1
def iter_node(self):
#遍历节点
curnode = self.root.next
while curnode is not self.tailnode:
yield curnode
curnode = curnode.next
yield curnode
def __iter__(self):
for node in self.iter_node():
yield node.value
def remove(self,value):#O(n)
prevnode = self.root
curnode = self.root.next
while curnode.next is not None:
if curnode.value == value:
prevnode.next = curnode.next
if curnode is self.tailnode:#注意更新tailnode
self.tailnode = prevnode
del curnode
self.length -= 1
return 1 #表明删除成功
else:#更新prevnode
prevnode = curnode
return -1
def find(self,value):
index = 0
for node in self.iter_node():
if node.value == value:
return index
index += 1
return -1
def popleft(self):
if self.root.next is None:
raise Exception('pop from empty LinkedList')
headnode = self.root.next
self.root.next = headnode.next
self.length -= 1
value = headnode
del headnode
return value
def clear(self):
for node in self.iter_node():
del node
self.root.next = None
self.length = 0