AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 商店
  • 应用
  • 文章
    • 题解
    • 分享
    • 问答
  • 吐槽
  • 登录/注册

AcWing 48. 复杂链表的复刻    原题链接    中等

作者: 作者的头像   天元之弈 ,  2022-08-06 21:18:34 ,  所有人可见 ,  阅读 24


4


思路

在原链表的两个结点中间新开一个结点,值和两个结点中的前一个相同,如下图:

这样子我们复制$random$的值就只要p->next->random=p->random->next。

代码

/**
 * 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) {
        //添上新结点
        for (auto p = head; p; p = p -> next -> next)
        {
            auto q = new ListNode(p -> val);
            auto next = p -> next;
            p -> next = q;
            q -> next = next;
        }
        //处理random
        for (auto p = head; p; p = p -> next -> next)
        {
            if (p -> random)
                p -> next -> random = p -> random -> next;
        }
        //把添上的结点弄到新链表里
        auto dummy = new ListNode(-1);
        auto q = dummy;
        for (auto p = head; p; p = p -> next)
        {
            q -> next = p -> next;
            //这里要复原链表(y总视频是错的)
            p -> next = p -> next -> next;
            q = q -> next;
        }
        return dummy -> next;
    }
};

感谢观看!(^o^)/

$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\mathcal{writer\enspace by \enspace acwing}$ : $\mathfrak{天元之弈}$

0 评论

你确定删除吗?

© 2018-2022 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息