利用python 完成 leetcode 138 复制带随机指针的链表

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的深拷贝。

示例:
在这里插入图片描述

输入:
{“KaTeX parse error: Expected '}', got 'EOF' at end of input: …":"1","next":{"id”:“2”,“next”:null,“random”:{“KaTeX parse error: Expected 'EOF', got '}' at position 9: ref":"2"}̲,"val":2},"rand…ref”:“2”},“val”:1}

解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
思路
先在每个节点后创建一个该节点的复制,再将复制节点的random指向原节点的random指向节点的复制节点,最后将链表分成两个
例如
N1->N2->N3
N1.random=N3
先在每个节点N在后创建一个复制节点M
N1->M1->N2->M2->N3->M3
对于复制节点M1
M1.random=N1.random.next (即M1.random=M3)
最后将链表分解为两个链表即
N1->N2->N3
N1.random=N3

M1->M2->M3
M1.random=M3
返回M1即可
代码

def copyRandomList(self, head: 'Node') -> 'Node':

    if head == None:return None
    l1=head
    while l1!=None:
        l2=Node(l1.val,None,None)#在每个节点后创建一个该节点的复制
        l2.next=l1.next
        l1.next=l2
        l1=l1.next.next
    N=head.next
    l1=head
    while l1!=None:
        if l1.random!=None:
            l1.next.random=l1.random.next#设置复制节点的random
        l1=l1.next.next
    l1=head
    while l1!=None:#将链表分成两个
        l2=l1.next
        l1.next=l2.next
        if l2.next!=None:l2.next=l2.next.next
        l1=l1.next
    return N

猜你喜欢

转载自blog.csdn.net/qq_37369124/article/details/88564292