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