确定循环链表中节点长度的值错误

时间:2019-01-28 06:36:20

标签: python python-3.x data-structures singly-linked-list

我想知道在尝试查找循环中连接的节点数时可能做错了什么。这是我在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

我真的很感谢一些指导。谢谢

1 个答案:

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