【leetcode】138. Copy List with Random Pointer解题报告

【leetcode】138. Copy List with Random Pointer解题报告_第1张图片
题目:
给定一个链表,这个链表中的节点不仅仅有next指针,还有一个random指针随机指向链表中的任何一个节点,也可能指向None,求对该链表进行深拷贝。
一道很好的题,思路如下:
首先不管random指针,先对每个节点进行拷贝,并将拷贝的结果放在被拷贝的节点之后,如下图所示X是原节点, X ′ X^{'} X是对原节点的拷贝。
【leetcode】138. Copy List with Random Pointer解题报告_第2张图片
接下来复制random指针,假如A的random指针指向C,那么 A ′ A' A的指针就要指向 C ′ C' C
【leetcode】138. Copy List with Random Pointer解题报告_第3张图片
所以 A ′ A' A的指针指向的就是Arandom指针指向的下一个节点

A'.random = A.random.next =C'
random指针复制完后,将复制的节点与原来节点断开,形成一条新的链即可
AC代码:

class Solution(object):
    def copyRandomList(self, head):
        """
        :type head: RandomListNode
        :rtype: RandomListNode
        """
        if head ==None:
            return None
        pNode = head
        while(pNode):
            copyNode = RandomListNode(pNode.label)
            copyNode.next = pNode.next
            pNode.next = copyNode
            pNode = copyNode.next

        slow = head
        while(slow ):
            if slow.random!=None:
                slow.next.random = slow.random.next
            slow = slow.next.next

        resHead = RandomListNode(-1)
        index = resHead
        pNode = head
        while(pNode):
            index.next = pNode.next
            index = index.next
            pNode.next = pNode.next.next
            pNode = pNode.next
            
        return resHead.next

你可能感兴趣的:(LeetCode)