return self 节点如何工作?(Python)

How does a node with return self work?(Python)

所以这是单向链表的节点部分。我不应该改变它的编码方式,但我不知道这种结构是如何工作的。 Self.link 无法访问事件以指向列表的另一部分。有谁知道如何使用这样的节点 class?

class Node:
    def __init__(self, inval=None):
        self.val = inval
        if inval==None:
            self.link = self
            print (self)

    def __str__(self):
        if self.val == None:
            return ''
        else:
            return str(self.val)

    def __repr__(self):
        return str(self)

Node 实现中没有任何内容会阻止您在 List class 中使用它。假装 Node.__init__() 的最后三行不存在。

这是在 List 中使用教授的 Node 的一种方法。

class Node:
    def __init__(self, inval=None):
        self.val = inval
        if inval==None:
            self.link = self
            print (self)

    def __str__(self):
        if self.val == None:
            return ''
        else:
            return str(self.val)

    def __repr__(self):
        return str(self)

class List:
    def __init__(self):
        self.head = None
    def prepend(self, val):
        head = Node(val)
        head.link = self.head
        self.head = head
    def append(self, val):
        if self.head is None:
            self.prepend(val)
        else:
            p = self.head
            while p.link is not None:
                p = p.link
            p.link = Node(val)
            p.link.link = None

    def __str__(self):
        result = '<'
        p = self.head
        while p is not None:
            result += str(p) + ', '
            p = p.link
        result += '>'
        return result

l = List()
l.append(3)
l.prepend(2)
l.append(4)
l.prepend(1)
l.append(5)
print(str(l))

结果如下:

<1, 2, 3, 4, 5, >

这是链表的另一种实现,它的节点样式略有不同。

class LinkedList:
    lock = 0
    if lock == 0:
        tempdata = None
    def __init__(self, *args):
        self.head = Node() # Node at the head of the list
        self.current = None # Node currently pointed to by the iterator
        self.count = 0

    def insert(self, value):
        NewNode =Node(value)
        NewNode.link = self.head
        self.head = NewNode
        self.count += 1

    def __iter__(self):
        self.current = self.head
        return self

    def __next__(self):
        self.current = LinkedList.tempdata
        if LinkedList.lock == 0:
            self.current = self.head
            LinkedList.lock += 1
        else:
            pass
        if self.current.value == None:
            LinkedList.lock = 0
            raise StopIteration
        previous = self.current
        self.current = self.current.link
        LinkedList.tempdata = self.current

        return previous   



    def __str__(self):
        result = ''
        self.current = self.head
        while self.current.value is not None:
            if self.current.link.value is None:
                result += str(self.current.value)
            else:
                result += str(self.current.value) + ' -> '
            self.current = self.current.link
        return result

    def search(self, value):
        found = 0
        temp = None
        out= False
        while found == 0:
            try:
                temp = LinkedList.__next__(self)
                if temp.value == value:
                    found += 1
                    out = temp


            except StopIteration:
                pass
        return out



    def delete(self, value):
        print ("hwta")
        found = 0
        temp = None
        head = self.head
        if head.value == value:
            print ("Head")
            if head.link.value != None:
                self.head = head.link

            else:
                self.head = Node()
        else:
            while found == 0:
                try:
                    temp = LinkedList.__next__(self)
                    if temp.link.value == value:
                        if temp.link.link.value == None:
                            temp.link = Node()
                            break
                        else:
                            temp.link = temp.link.link
                            print ("tails")
                            break
                except StopIteration:
                    pass



    def __repr__(self):
        return str(self)

#a = Node()
#print(a)                  # 3
#b = Node("Hullo")
#print(b)                  # 'Hullo'
#lst = LinkedList()
#lst.insert(2)
#lst.insert(3)
#lst.insert(5)
#lst.insert(6)
#lst.insert(7)
#lst.insert(6)
#print(lst)                # 5 -> 3 -> 2
#c = lst.search(2)
#print(c)                  # 3
#print(c.link)             # 5
#lst.insert(2)
#print(lst.head.link.link) # 3
lst.delete(6)
print (lst)
#print(next(lst))          # should print 5, 3, 2 on separate lines
#lst.delete(2)
#print(lst)                # 5 -> 3
#print(len(lst))           # 2
#for u in lst:
#    print(u)