Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Runner技术,用于组合两个一般大小的相等链表_Python 3.x_Linked List - Fatal编程技术网

Python 3.x Runner技术,用于组合两个一般大小的相等链表

Python 3.x Runner技术,用于组合两个一般大小的相等链表,python-3.x,linked-list,Python 3.x,Linked List,二, 所以,我在这里面临一个疑问 我正在读《破解密码》这本书。下面的文字写在那里 假设你有一个链表a1->a2….->an->b1->b2….bn,你想把它重新排列成a1->b1->a2->b2->….an->bn。你不知道链表的长度,但你只知道它是一个偶数 (此处两个链表的长度相同) 对于p2的每一次移动,可以让一个指针p1(快速指针)每两个元素移动一次。当p1到达链表的末尾时,p2将位于端点。然后,将p1移回到前面,开始“编织”元素。在每次迭代中,p2选择一个元素并将其插入p1之后 我不明白

二, 所以,我在这里面临一个疑问

我正在读《破解密码》这本书。下面的文字写在那里

假设你有一个链表a1->a2….->an->b1->b2….bn,你想把它重新排列成a1->b1->a2->b2->….an->bn。你不知道链表的长度,但你只知道它是一个偶数

(此处两个链表的长度相同)

对于p2的每一次移动,可以让一个指针p1(快速指针)每两个元素移动一次。当p1到达链表的末尾时,p2将位于端点。然后,将p1移回到前面,开始“编织”元素。在每次迭代中,p2选择一个元素并将其插入p1之后

我不明白当p1到达链表的末尾时,p2怎么会在中点。如果n=3(长度=6),我就是这样想象的。下面的每一步都代表一次迭代

我尝试了由4个元素组成的链接列表,并成功地实现了结果。然而,我无法解决一般情况,因为我的指针会变得危险。有没有可能用python为这个问题提供代码,我被卡住了。这是我的代码:

def runner_technique_ex(self, head):
    """
    Assume the length of the ll that we will run thru will be even
    :param head:
    :return:
    """
    slow = head
    fast = head.next
    while fast.next is not None:
        slow = slow.next
        fast = fast.next.next

    fast = head
    slow = slow.next
    while slow.next is not None:
        tempSlow = slow
        tempFast = fast.next
        fast.next = tempSlow
        slow = slow.next
        tempSlow.next = tempFast
        tempFast.next = slow

经过一番斗争才明白

def runner_technique_ex(self, head):
    """
    Assume the length of the ll that we will run thru will be even
    :param head:
    :return:
    """
    slow = head
    fast = head.next
    while fast.next is not None:
        slow = slow.next
        fast = fast.next.next

    fast = head
    slow = slow.next

    newHead = Node(fast.data)
    newHeadExtraPointer = newHead
    newHead.next = Node(slow.data)

    newHead = newHead.next
    while slow.next is not None:

        fast = fast.next
        slow = slow.next

        fastNextNode = Node(fast.data)
        slowNextNode = Node(slow.data)

        fastNextNode.next = slowNextNode
        newHead.next = fastNextNode
        newHead = fastNextNode.next

    return newHeadExtraPointer

“有可能用python为这个问题提供代码吗”——首先,堆栈溢出不是一种代码编写服务。你被要求发布你的作品,展示你迄今为止所做的尝试,并将你的问题具体化到你遇到的问题上。第二,如果你对你的问题和答案所用的语言很挑剔,你需要在你的问题上加上这种语言作为标签。除此之外,你的问题中甚至不清楚问题是什么。我发现很明显,如果你正在遍历一个长度为M的列表,其中M=2*N,一个指针每次向前移动两个节点(即跳过一个),那么第一个指针在列表中移动的速度将是第二个指针的两倍,因此当第一个指针到达末尾时,第二个只会中途(一个速度是另一个速度的两倍,和另一个速度的一半一样)。正如你所看到的,我已经达到了慢指针位于中间,快速指针位于开始的那一刻。然而,我对第二个循环中的指针感到困惑,而你可能对你的问题不太感兴趣,因为缺少一个循环。这就是说:在您发布的代码中,我建议删除最后一行代码,并添加语句以推进
fast
slow
指针。我也不会在第二个循环中使用名称
fast
slow
,因为这些名称不再描述指针。最后,不要低估铅笔和纸的用处,手动跟踪算法,并绘制图表,在每个语句中显示列表的状态。