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

 

posted @ 2019-01-05 23:37  DRQ丶  阅读(161)  评论(0编辑  收藏  举报