我想知道在尝试查找循环中连接的节点数时可能做错了什么。这是我在python中的实现。
# Defined Node class
class Node(object):
data = 0
def __init__(self, data=None, next_node=None):
self.data = self.increment()
self.next = next_node
def increment(self):
Node.data += 1
return Node.data
def setNext(self, next_node = None):
self.next = next_node
我定义了一个函数,该函数通过接收任意数量的节点以及所需的循环长度作为参数来创建节点链。
def create_chain(num_of_nodes, loop_size):
nodes = [Node() for _ in range(num_of_nodes)]
if loop_size == 0:
return nodes[0]
else:
for node, next_node in zip(nodes, nodes[1:]):
node.next = next_node
# cleaned_nodes.append(node)
nodes[num_of_nodes-1].next = nodes[(num_of_nodes - loop_size)-1]
return nodes[0]
然后我定义了一个函数,以确定给定初始节点(作为参数传递给该函数)的循环大小。
def loop_size(node):
count = 0
if node == None:
return 1
if node.next == None:
return 1
slow = fast = node
while(slow or fast or node.next):
count += 1
if fast.next == None:
#count += 1
break
if slow == fast.next or slow == fast.next.next:
count += 1
break
slow = slow.next
fast = fast.next.next
return count
我写了一些测试,但是这个特定的断言不起作用,我想理解为什么。
def test_very_long_chain(self):
self.chain = create_chain(3904, 1087)
self.assertEqual(loop_size(self.chain), 10, 'Loop size of 10 expected')
我收到这个断言错误;
AssertionError: 3264 != 10 : Loop size of 10 expected
我真的很感谢一些指导。谢谢
答案 0 :(得分:1)
我在create_chain和loop_size中发现了一些问题。
在 create_chain 中,逻辑不清楚,当loop_size == 0时,没有创建链,但是我想无论循环大小如何都应创建链?
函数 create_chain 中循环大小的定义也不严格,假设有300个节点,是否可以创建长度为300的循环?如果是,则此行“ nodes [num_of_nodes-1] .next =节点[(num_of_nodes-loop_size)-1]”应更改。
最大的问题是 loop_size 函数,我看到您使用快速慢速指针方法来尝试计算循环长度,但是快速慢速方法主要用于检测循环,它可以找到循环的入口。当您找到循环的入口时,计算循环长度应该很容易,因此我在 loop_size 函数中添加了此辅助函数。
在函数 loop_size 中的while循环括号内,它应为“ and”而不是“ or”。下面是我对类和方法的重写。希望这就是您想要的!
class Node(object):
def __init__(self, data=None, next_node=None):
self.data = data
self.next = next_node
def increment(self):
self.data += 1
return self.data
def setNext(self, next_node=None):
self.next = next_node
def create_chain(number, loop):
if number <= 0 or loop > number:
print("Error")
return
nodes = [Node(i) for i in range(number)]
for i in range(number-1):
nodes[i].setNext(nodes[i+1])
if loop > 0:
nodes[number-1].setNext(nodes[number-loop])
return nodes[0]
def loop_size(node):
def helper(node):
#print(node.data)
count = 1
temp = node
while(temp.next != node):
temp = temp.next
count += 1
return count
if not node:
return 0
slow = fast = node
while(slow and fast and fast.next):
slow = slow.next
fast = fast.next.next
if slow == fast:
return helper(slow)
return 0
chain = create_chain(300, 300)
print(loop_size(chain))
chain = create_chain(300, 0)
print(loop_size(chain))
chain = create_chain(300, 130)
print(loop_size(chain))