美文网首页
offer035复杂链表的复制

offer035复杂链表的复制

作者: D_w | 来源:发表于2022-03-15 15:14 被阅读0次

    请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    image.png
    解法:
    分为三步:
    第一步:复制复杂指针的val和next。但是这次我们把复制的结点跟在元结点后面,而不是直接创建新的链表;
    第二步:设置复制出来的结点的random。因为新旧结点是前后对应关系,所以也是一步就能找到random;
    第三步:拆分链表。奇数是原链表,偶数是复制的链表。
    python解法
    """
    # Definition for a Node.
    class Node:
        def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
            self.val = int(x)
            self.next = next
            self.random = random
    """
    class Solution:
        def copyRandomList(self, head: 'Node') -> 'Node':
            if not head: return
            cur = head
            # 1. 复制各节点,并构建拼接链表
            while cur:
                tmp = Node(cur.val)
                tmp.next = cur.next
                cur.next = tmp
                cur = tmp.next
            # 2. 构建各新节点的 random 指向
            cur = head
            while cur:
                if cur.random:
                    cur.next.random = cur.random.next
                cur = cur.next.next
            # 3. 拆分两链表
            cur = res = head.next
            pre = head
            while cur.next:
                pre.next = pre.next.next
                cur.next = cur.next.next
                pre = pre.next
                cur = cur.next
            pre.next = None # 单独处理原链表尾节点
            return res      # 返回新链表头节点
    

    java解法

    import javax.xml.soap.Node;
    
    public class Offer35 {
        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,res = 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 res;
        }
    }
    

    相关文章

      网友评论

          本文标题:offer035复杂链表的复制

          本文链接:https://www.haomeiwen.com/subject/dirydrtx.html