在python链表中实现__next__()

问题描述

我想通过迭代指定次数来检索链表中的特定节点;例如,检索第 4 个节点。通过实现 __iter__(),我可以使用 for 循环进行迭代,但我不知道如何让 next() 函数工作。我已经注释掉了我对 next() 函数的尝试;当它被留在里面时,我仍然得到 AttributeError: 'LinkedList' object has no attribute 'next'

编辑:如果可能,我希望 getNode(self,loc) 通过调用 next() 返回指定位置的节点。

这是 Node 和 LinkedList 类:

class Node:
    def __init__(self,data = None):
        self.data = data
        self.next = None
        
    def __repr__(self):
        return str(self.data)
        
class LinkedList:
    def __init__(self,nodes = None):
        self.head = None
        if nodes is not None:
            node = Node(data=nodes.pop(0))
            self.head = node
            for elem in nodes:
                node.next = Node(data=elem)
                node = node.next
        
    def __repr__(self):
        node = self.head
        nodes = []
        while node is not None:
            nodes.append(str(node.data))
            node = node.next
        nodes.append("None")
        return " -> ".join(nodes)
    
    def __iter__(self):
        node = self.head
        while node is not None:
            yield node
            node = node.next
    
    # def __next__(self):
    #     return self.next
    

    def getNode(self,loc):
        cnt = 0
        for i in self:
            if cnt < loc:
                cnt += 1
            else:
                break 
        return i
            
        
ll = LinkedList([1,2,3,4,5])
print(ll)
print(ll.getNode(3))

for i in range(3):
    print(ll.next())

[输出] 一世 1 -> 2 -> 3 -> 4 -> 5 -> 无 4 回溯(最近一次调用):

  File "/Users/jk/_python_source/misc_python/_mymisc/Leetcode work/LinkedList.py",line 53,in <module>
    print(ll.next())

AttributeError: 'LinkedList' object has no attribute 'next'

解决方法

你做的工作比你需要做的要多得多。一旦您实施了 __iter__,其余的就都到位了。您可以使用它来实现几乎所有其他功能,例如 get_node__str____repr__ 等。

class Node:

    def __init__(self,value):
        self.value = value
        self.next = None

    def __str__(self):
        return str(self.value)


class LinkedList:

    def __init__(self):
        self.head = None

    def add(self,value):
        if self.head is None:
            self.head = Node(value)
        else:
            for cursor in self:
                pass
            cursor.next = Node(value)
        return self

    def get_node(self,node_index):
        for index,node in enumerate(self):
            if index == node_index:
                break
        else:
            return None
        return node

    def __str__(self):
        return " -> ".join(map(str,self))

    def __iter__(self):
        cursor = self.head
        while cursor is not None:
            yield cursor
            cursor = cursor.next

ll = LinkedList().add(1).add(2).add(3)
print(ll)

for node_index in 0,1,2,3:
    print("The node at index {} is {}".format(node_index,ll.get_node(node_index)))

输出:

1 -> 2 -> 3
The node at index 0 is 1
The node at index 1 is 2
The node at index 2 is 3
The node at index 3 is None
>>> 
,

const interestToken = artifacts.require("./interestToken.sol"); const ethBank = artifacts.require("./ethBank.sol"); module.exports = async function(deployer) { await deployer.deploy(interestToken) const token = await interestToken.deployed() await deployer.deploy(ethBank,interestToken.address) const ethBank = await ethBank.deployed() await interestToken.kreditorWechseln(ethBank.address) 也有效:

getNode()