python 实现单链表

匿名 (未验证) 提交于 2019-12-02 22:11:45
# -*- 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 实现单链表
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!