# -*- coding:utf-8 -*- class Node(object): def __init__(self, value=None, next=None): self.value = value self.next = 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 # 调用的时候 len(self) = self.length def append(self, value): # 实现尾插法 if self.maxsize is not None and len(self) > self.maxsize: # self.length = len(self) raise Exception('Full') node = Node(value) # 定义一个新节点 tailnode = self.tailnode # 取一下尾结点 if tailnode is None: # 如果尾结点为空,则表明只有一个root结点 self.root.next = node # root结点直接链接新建立的结点 else: tailnode.next = node # 否则 尾结点的下一结点为新建立的结点 self.tailnode = node # 更新尾结点 self.length += 1 # 长度加一 def appendleft(self, value): headnode = self.root.next # headnode 相当于一个tmp, 只是暂时存下 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 的时候 返回的事一个迭代值 yield curnode curnode = curnode.next yield curnode # 此时更新到了最后一个结点, 也要yield 出来 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 # 这里这么写是因为在下次循环的时候, curnode会递增, 所以prevnode 是curnode的上一个node 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 emptyLinkedList") headnode = self.root.next self.root.next = headnode.next self.length -= 1 value = headnode.value del headnode return value def clear(self): for node in self.iter_node(): del node self.root.next = None self.length = 0
# 下面是测试 def test_linklist(): ll = LinkedList() ll.append(1) ll.append(2) ll.append(3) ll.append(100) assert len(ll) == 4 assert ll.find(100) == 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()
python 实现单链表
猜你喜欢
转载自www.cnblogs.com/dairuiquan/p/10159580.html
今日推荐
周排行