不带类的双链表

时间:2019-01-15 09:01:56

标签: python python-3.x linked-list

我仍在学习python并具有以下代码:

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

    def traverse(self):
        node = self
        while node is not None:
            print(node.val)
            node = node.next


def LinkedListCreator(non_linked_list):
    linked_list = []
    for element in non_linked_list:
        node = Node(element)
        if(len(linked_list)) > 0:
            linked_list[-1].next = node
        linked_list.append(node)
        if(len(linked_list)) > 1:
            prev_node = linked_list[-2]
            linked_list[-1].prev = prev_node
    linked_list[0].prev = linked_list[-1]
    linked_list[-1].next = linked_list[0]
    return linked_list

abc = [1, 2, 3]
deg = LinkedListCreator(abc)

deg[0].traverse()

现在,鉴于这是一个双向链接的列表(但不是真的,因为列表本身不是一个类),如何遍历它而不陷入无休止的循环?显而易见的选择是保存第一个元素,并在再次到达它时停止迭代。 这是否是带有函数的双向链表的正确实现,还是应该严格将链表实现为具有自己的类方法的类?

2 个答案:

答案 0 :(得分:0)

将来,我建议将此类问题发布到https://codereview.stackexchange.com/

关于:

  

我如何遍历它而不陷入无休止的循环?显而易见的选择是保存第一个元素,并在再次到达它时停止迭代。

我愿意:

class Node:
    …

    def iter_vals(self):
        yield self.val
        node = self.next
        while node is not self:
            yield node.val
            node = node.next

I yield个元素,以便调用者可以决定要使用它们做什么,而不是始终打印它们。安排此while循环的方式有很多种,但似乎没有一种特别好,例如:

    def iter_vals(self):
        node = self
        while True:
            yield node.val
            node = node.next
            if node is self:
                break

也可以,但是似乎不太清楚。关于第二个问题:

  

这是否也是带有函数的双向链表的正确实现,还是应该严格使用自己的类方法将链表实现为一个类?

我没有运行您的代码,但是看起来不错。是否值得为其创建一个完整的单独类取决于您尚未提供任何信息的各种工程折衷。例如:

  • 什么对呼叫者更有意义
  • 是否需要保留更多状态
  • 您打算如何进行测试
  • 您还想使用其他哪些方法

我建议的一件事是命名约定……从代码的颜色上可以看出,只有类/类型名倾向于CamelCased,而其他标识符是小写的。因此,我将您的LinkedListCreator命名为create_linked_list

答案 1 :(得分:0)

您实际上不必“保存”第一个元素,因为这是您的 self 变量已经执行的操作。如果节点的后继节点等于遍历节点,则使代码正常工作的最小附加要求是:

    def traverse(self):
        node = self
        while node is not None:
            print(node.val)
            node = node.next
            if node == self:
                break

或同样,但阅读起来可能更直观:

    def traverse(self):
        node = self
        while node is not None:
            print(node.val)
            if node.next == self:
                break
            node = node.next