【问题标题】:How do you create a LinkedList which contains loops?如何创建包含循环的 LinkedList?
【发布时间】:2019-02-14 00:17:29
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 看看你的循环,Node_1 的下一个节点不应该是节点 7 吗?
  • 您正在创建两个名为 Node_1 的节点节点。
  • 另外,把所有; 放在那个解决方案中的人打一巴掌

标签: python oop object pointers linked-list


【解决方案1】:

行:

Node_1 = Node(1, Node_7)

正在创建一个节点,它不会修改从Node_2 链接的原始Node_1。您创建的列表如下所示:

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)

【讨论】:

  • set_next方法从何而来?
  • 您需要将其添加到Node 类中。
  • 你不能最后定义节点1吗?
  • @SuperStew 那你会在Node_2中使用什么?
  • 哦,是的。有道理
猜你喜欢
  • 2020-05-15
  • 2017-07-20
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
相关资源
最近更新 更多