我正在尝试为hackerrank提供的解决方案提供一个测试用例,以检测python链表中的周期。 hackerrank提供的解决方案是:
class Node(object):
def __init__(self, data = None, next_node = None):
self.data = data
self.next = next_node
def has_cycle(head):
fast = head;
while(fast != None and fast.next != None):
fast = fast.next.next;
head = head.next;
if(head == fast):
return True;
return False;
所以我创建了我以为是下面的LinkedList
8 -> 7 -> 6 -> 5 -> 4 -> 3
^ |
| V
1 <-----------------2
使用此代码:
Node_1 = Node(1)
Node_2 = Node(2, Node_1)
Node_3 = Node(3, Node_2)
Node_4 = Node(4, Node_3)
Node_5 = Node(5, Node_4)
Node_6 = Node(6, Node_5)
Node_7 = Node(7, Node_6)
Node_8 = Node(8, Node_7)
Node_1 = Node(1, Node_7)
但是结果不是我所期望的:
print(has_cycle(Node_8)) # returns False
print(Node_2.next.next) # returns None
print(Node_1.next.data) # returns 7
这可以在C ++中工作,所以让我认为问题在于我正在传递对象的副本而不是它们的指针。如果是这样的话,有人可以向我指出一些材料以了解这些概念吗?
此外,我将如何创建上述测试用例?
谢谢!
答案 0 :(得分:1)
该行:
Node_1 = Node(1, Node_7)
正在创建一个 new 节点,而不是修改从Node_1
链接的原始Node_2
。您创建的列表如下:
8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1
^
1 ---|
要创建一个循环,您需要一种方法来修改现有节点的next
链接。将此方法添加到Node
类中:
def set_next(self, next_node = None):
self.next = next_node
然后将最后一行替换为:
Node_1.set_next(Node_7)