美文网首页链表
【剑指 offer】复杂链表的复刻

【剑指 offer】复杂链表的复刻

作者: 邓泽军_3679 | 来源:发表于2019-04-14 10:57 被阅读0次

    1、题目描述

    请实现一个函数可以复制一个复杂链表。

    在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。

    2、问题描述:

    3、问题关键:

    • 在每个结点后面插入一个和当前结点相同的结点,再,将插入的结点的random指针指向和原来对应的结点的下一个就可以了。

    4、C++代码:

    /**
     * Definition for singly-linked list with a random pointer.
     * struct ListNode {
     *     int val;
     *     ListNode *next, *random;
     *     ListNode(int x) : val(x), next(NULL), random(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *copyRandomList(ListNode *head) {
            if (!head) return head;
            auto p = head;
            while(p) {//在每个结点后面插入一个和当前结点相同的结点。
                auto tmp = new ListNode(p->val);
                auto t = p->next;
                p->next = tmp;
                tmp->next = t;
                p = t;
            }
            p = head;
            while(p) {//将新的结点的random指针指向原结点的random指针的下一个结点。
                if (p->random) 
                    p->next->random = p->random->next;
                p = p->next->next;
            }
            p = head;
            ListNode *dummy = new ListNode(-1);
            auto cur = dummy;
            while(p) {//断开结点,提取出新建的结点。
                cur->next = p->next;
                cur = cur->next;
                p = cur->next;
            }
            return dummy->next;
        }
    };
    
    

    相关文章

      网友评论

        本文标题:【剑指 offer】复杂链表的复刻

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