如何创建包含循环的LinkedList?

时间:2019-02-14 00:17:30

标签: python oop object pointers linked-list

我正在尝试为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 ++中工作,所以让我认为问题在于我正在传递对象的副本而不是它们的指针。如果是这样的话,有人可以向我指出一些材料以了解这些概念吗?

此外,我将如何创建上述测试用例?

谢谢!

1 个答案:

答案 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)