美文网首页链表
【剑指 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