python 实现单链表
# -*- coding:utf-8 -*- class Node(object): def __init__(self, value = None, next = None): self.value = value self.next = next class Linklist(object): def __init__(self, maxsize = None): self.maxsize = maxsize self.tailnode = None self.length = 0 self.root = Node() def __len__(self): return self.length def append(self, value): if self.maxsize is not None and self.length > maxsize: raise Exception("full") node = Node(value) if self.tailnode is None: self.root.next = node else: self.tailnode.next = node self.tailnode = node self.length += 1 def appendleft(self, value): node = Node(value) if self.root.next is None: self.root.next = node self.tailnode = node else: oldhead = self.root.next self.root.next = node node.next = oldhead 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): prevnode = self.root for curnode in self.iter_node(): if curnode.value == value: prevnode.next = curnode.next if curnode is self.tailnode: self.tailnode = prevnode del curnode self.length -= 1 return 1 else: prevnode = curnode return -1 def find(self, value): # 这个是返回列表,为了处理一个值返回多次的情况 l = [] index = 0 for node in self.iter_node(): if node.value == value: l.append(index) index += 1 if len(l) == 0: return -1 else: return l def popleft(self): if self.root.next is None: raise Exception("链表为空") headnode = self.root.next self.root.next = headnode.next value = headnode.value del headnode self.length -= 1 return value def clear(self): for node in self.iter_node(): del node self.length = 0 self.root.next = None def test_linklist(): ll = Linklist() ll.append(1) ll.append(2) ll.append(3) ll.append(100) assert len(ll) == 4 l = ll.find(100) l = ll.find(100) assert l[0] == 3 assert ll.find(231) == -1 ll.remove(100) assert len(ll) == 3 assert ll.find(100) == -1 assert list(ll) == [1, 2, 3] ll.appendleft(0) assert list(ll) == [0, 1, 2, 3] assert len(ll) == 4 headnode = ll.popleft() assert headnode == 0 assert len(ll) == 3 assert list(ll) == [1, 2, 3] ll.clear() len(ll) == 0 test_linklist()