今日题目(剑指Offer系列)
剑指 Offer 35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。 在复杂链表中,每个节点除了有一个 next 指针指向下一个节点, 还有一个 random 指针指向链表中的任意节点或者 null。
示例:
解题思路:
>本题的目标就是将给定的链表进行复制 >但是会存在一个问题就是复制链表时内部的指针不容易复制 >所以想到我们拼接一份相同的节点在每个节点后面 >这样就会发现新节点的random就是原节点的random的next,因为是一样的 >所以流程就是首先拼接一份新的链表 >然后遍历链表修改新节点的random的指针 >最后就是将我们的新节点拆分出来
Python解法:
class Solution: def copyRandomList(self, head: 'Node') -> 'Node': if not head: return None cur=head while cur!=None: tmp=Node(cur.val) tmp.next=cur.next cur.next=tmp cur=tmp.next cur=head while cur!=None: if cur.random: cur.next.random=cur.random.next cur=cur.next.next; pre=head myHead=head.next cur=head.next while cur.next: pre.next=pre.next.next cur.next=cur.next.next pre=pre.next cur=cur.next return myHead
Java解法:
class Solution { public Node copyRandomList(Node head) { if(head==null){ return null; } Node cur=head; while(cur!=null){ Node tmp=new Node(cur.val); tmp.next=cur.next; cur.next=tmp; cur=tmp.next; } cur=head; while(cur!=null){ if(cur.random!=null){ cur.next.random=cur.random.next; } cur=cur.next.next; } cur = head.next; Node pre = head, myHead = head.next; while(cur.next != null) { pre.next = pre.next.next; cur.next = cur.next.next; pre = pre.next; cur = cur.next; } pre.next = null; return myHead; } }
