当前位置: 首页 > 知识库问答 >
问题:

如何使用遍历双向链表并跳过空节点的迭代器

云霖
2023-03-14

由于双链表有两个虚拟节点,一个是头部,另一个是尾部。我可以通过self跳过伪尾节点__current==None:raise StopIteration,但我不知道如何传递虚拟头节点并继续遍历以下节点。

class LinkedListDLL:

    def __init__(self):
        self.__head = NodeDLL(None)
        self.__head.set_next(self.__head)
        self.__head.set_prev(self.__head)
        self.__count = 0

    def size(self):
        return self.__count;

    def is_empty(self):
        return self.__count == 0

    def add_before(self, item, curr):
        new_node = NodeDLL(item)
        new_node.set_next(curr)
        new_node.set_prev(curr.get_prev())
        curr.set_prev(new_node)
        new_node.get_prev().set_next(new_node)
        self.__count += 1

    def add_to_head(self, item):
        self.add_before(item, self.__head.get_next())

    def add_to_tail(self, item):
        self.add_before(item, self.__head)

    def remove_from_head(self):
        self.remove(self.__head.get_next())

    def remove_from_tail(self):
        self.remove(self.__head.get_prev())

    def remove(self, curr):
        curr.get_prev().set_next(curr.get_next())
        curr.get_next().set_prev(curr.get_prev())
        self.__count -= 1

    def __iter__(self):
        return LinkedListIterator(self.__head)

class LinkedListIterator:
    def __init__(self, head):
        self.__current = head

    def __next__(self):
        if self.__current == None :
            raise StopIteration
        else:
            item = self.__current.set_data.get_next()
            self.__current = self.__current.get_next()
            return item

共有1个答案

房唯
2023-03-14

您应该重构代码,记住nodedell(None)可能与None不同。完成后:

def __next__(self):
    if not self.__current.get_next():
        raise StopIteration
    #Skips first value in list, i.e. head
    self.__current = self.__current.get_next()
    return self.__current
 类似资料:
  • 我有一个双链接列表,看起来像: 当我使用迭代器和下面的代码遍历列表时,输出会精确打印上面写的内容。 但是,我希望在遍历列表时跳过空节点,以便它只打印: 我无法让我的代码做到这一点。这是我迄今为止所想出的。 问题是我得到了一个NoTouchElementException错误,但我不知道如何修复它。我猜是因为当我到达第二个空虚拟节点时,我试图跳过它,但没有其他节点可以跳到。 我的问题是,如何更改代码

  • 我目前正在学习数据结构考试,遇到了一个关于迭代的问题。 在单链表上实现双向迭代器是可能的吗?如果是的话,如何实施呢? 我有一个想法,首先向前遍历链表,并存储一个临时链表,该临时链表保存反向的节点。但是遍历这个临时列表将导致一个只允许向后遍历的迭代器。

  • 我写了下面的代码,但它在执行create()函数后停止工作。我想从头节点开始删除替代元素。我的delete_Alt()函数正确吗?请告诉我哪里错了。

  • 问题内容: 如何以相反的顺序遍历链接哈希表?地图中是否有预定义的方法可以做到这一点? 我创建它如下: 问题答案: List > list = new ArrayList<>(map.entrySet()); 确实不是很漂亮,但是要花费一个条目集的副本,如果您的地图上有很多条目,则可能会出现问题。 出色的Guava库具有一个,可让您将Java 5用于每个样式循环而不是索引循环:

  • 每次我们在堆中为链表分配内存时,我们都会得到一个地址,这个地址链接到链表的下一个变量,head是指向链表初始节点的指针。 如果我们做,那么它会指向下一个链表,或者指向堆的随机内存,或者指向堆中初学者列表的下一个内存。

  • 我真的很难修复我的代码。我已经创建了一个双链接列表,我正试图反向遍历它。 有什么想法吗? 这是我的代码:Node。爪哇: 下面是第二个类“DNode.java”: 最后,这里是双链接列表。java:(重写另一个类“链表”中的“添加”和“删除”方法) 公共类双链接列表扩展了链接列表{ 我可以向前打印列表,但向后打印时会遇到无限循环。有什么想法吗? 谢谢