python 实现单链表

# -*- 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()

猜你喜欢

转载自www.cnblogs.com/dairuiquan/p/10159580.html