分隔一个单链表,以便所有奇数节点一起出现,而偶数节点一起出现

时间:2019-07-14 04:52:32

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

给出一个单链表,将所有奇数节点和偶数节点分组在一起。

您应该尝试就地进行。该程序应在O(1)空间复杂度和O(节点)时间复杂度下运行。

示例1:

输入:1-> 2-> 3-> 4-> 5-> NULL 输出:1-> 3-> 5-> 2-> 4-> NULL 示例2:

输入:2-> 1-> 3-> 5-> 6-> 4-> 7-> NULL 输出:2-> 3-> 6-> 7-> 1-> 5-> 4-> NULL 注意:

偶数和奇数组内的相对顺序应保持输入中的原样。 第一个节点被认为是奇数,第二个节点被认为是偶数,依此类推。

我尝试在StackOverflow上查找此问题,尽管我找到了很多答案,但没有一个回答了为什么我的代码被破坏了。另外,我正在使用Python3,所以我无法理解所编写的代码。具体来说,我想知道为什么我的代码无法正常工作。

因此,我已经为这个问题编写了代码。但是,当我在计算机上运行此代码时,它不起作用。

我的逻辑很简单。首先,我存储第二个节点的值,因为它将是列表的偶数一半中的第一个节点。

此后,获取第一个节点的值,并使其指针指向下一个节点的下一个节点。最后,剩下的场景是最后一个节点是列表中奇数部分的最后一个节点。

由于我已经存储了列表后半部分的第一个节点,所以现在我要做的就是获取最后一个节点的指针以指向该第一个节点。我不返回任何值,因为只要在每个节点上调用next_node,我都应该获得与以前不同的值。

def oddEvenNodes(root_node):    
  #Here I store the value of the second node
  if root_node.next_node is None:
    return root_node
  else:
    second_node=root_node.next_node
    node_val=root_node
    prev_node=root_node

 #This is where the actual removing takes place
   while node_val.next_node.next_node is not None:
      prev_node=node_val
      node_val=node_val.next_node
      prev_node.next_node=prev_node.next_node.next_node
  node_val.next=second_node

1 个答案:

答案 0 :(得分:1)

算法的想法是正确的,但错误在最后一行:

node_val.next=second_node

首先,没有next属性;它应该是next_node。但是,仅当node_val是奇数节点时,这才是正确的。如果它是偶数节点,则需要对列表中最后一个节点(最后一个奇数节点)进行此分配。在这种情况下,当前用户应该将None设为next_node

因此,为了知道您是结到奇数节点还是偶数节点,可以引入一个计数器。更正后的代码如下所示:

def oddEvenNodes(root_node):    
    if root_node.next_node is None:
        return root_node # Note: no need for ELSE after a RETURN
    second_node = root_node.next_node
    node_val = root_node
    prev_node = root_node
    count = 0 # Added this counter
    while node_val.next_node.next_node is not None:
        count += 1 # Keep track of odd/even
        prev_node = node_val
        node_val = node_val.next_node
        prev_node.next_node = node_val.next_node # Note: shorter way
    if count % 2: # Need different treatment when node is even
        node_val.next_node.next_node = second_node
        node_val.next_node = None
    else: # For odd node: do what you already did, but with bug-fix
        node_val.next_node = second_node
    return root_node # Add this to be consistent with other RETURN