链表

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

2019-04-14  本文已影响0人  邓泽军_3679

1、题目描述

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

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

2、问题描述:

3、问题关键:

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;
    }
};

上一篇 下一篇

猜你喜欢

热点阅读