老师,我不太懂为什么链表类中每个方法都要返回node,好像最后并没有接收这个node,还有我这个语句不报错,但没打印东西

来源:5-3 双向链表的原理与实践2

weixin_慕粉3028671

2019-07-05

#! -*- encoding=utf-8 -*-

class Node:
    def __init__(self,key,value):
        self.key=key
        self.value=value
        self.prev=None
        self.next=None

    def __str__(self):
        val="{%d: %d}"%(self.key,self.value)
        return val
    def __repr__(self):
        val="{%d: %d}"%(self.key,self.value)
        return val

class Doublelinkedlist:
    def __init__(self,capacity=0xffff):
        self.capacity=capacity
        self.head=None
        self.tail=None
        self.size=0
    #从头部添加
    def __add_head(self,node):
        if not self.head:
            self.head=node
            self.tail=node
            self.head.next=None
            self.head.prev=None
        else:
            node.next=self.head
            self.head.prev=node
            self.head=node
            self.head.prev=None
        self.size+=1
        return node
    #从尾部添加节点
    def __add_tail(self,node):
        if not self.tail:
            self.tail=node
            self.head=node
            self.tail.next=None
            self.tail.prev=None
        else:
            self.tail.next=node
            node.prev=self.tail
            self.tail=node
            self.tail.next=None
            self.size+=1
        return node
    #从尾部删除
    def __del_tail(self):
        if not self.tail:
            return
        node =self.tail
        if node.prev:
            self.tail=node.prev
            self.tail.next=None
        else:
            self.head=self.tail=None
        self.size-=1
        return node


    #从头部删除
    def __del_head(self):
        if not self.head:
            return
        node=self.head
        if node.next:
            self.head=node.next
            self.head.prev=None
        else:
            self.tail=self.head=None
        self.size-=1
        return node

    #任意节点删除
    def __remove(self,node):
        if not node:
            node=self.tail
        if node==self.tail:
            self.__del_tail()
        elif node==self.head:
            self.__del_head()
        else:
            node.prev.next=node.next
            node.next.prev=node.prev
            self.size-=1
        return node
    #弹出头部节点
    def pop(self):
        return self.__del_head()
    #添加节点
    def append(self,node):
        return self.__add_tail(node)
    # 往头部添加节点
    def append_front(self,node):
        return self.__add_head(node)
    #删除节点
    def remove(self,node=None):
        return self.__remove(node)
    def print(self):
        p=self.head
        line=""
        while p:
            line+="%s"%p
            p=p.next
            if p:
                line+="=>"
        print(line)

if __name__=="main":
    l=Doublelinkedlist(10)
    nodes=[]
    for i in range(10):
        node=Node(i,i)
        nodes.append(node)
    l.append(nodes[0])
    l.print()
    l.append(nodes[1])
    l.print()
    l.append(nodes[2])
    l.print()
    l.pop()
    l.print()
    l.remove(nodes[2])
    l.print()
写回答

1回答

咚咚呛

2019-07-05

关于操作链表返回node其实是写相关函数的一个最佳实践,虽然在这里没有使用到node,但是难保以后在使用相关函数的时候不会用到,因此这是一种较为优雅的代码书写风格。

希望对你有所帮助。

1
2
咚咚呛
回复
weixin_慕粉3028671
没有执行到main函数,if __name__ == 'main'错了。 应该为if __name__ == '__main__'
2019-07-05
共2条回复

(新版)计算机基础,计算机组成原理+操作系统+网络

编程之前先学这门课,系统补足计算机基础知识,夯实编程地基

7739 学习 · 1580 问题

查看课程