138. Copy List with Random Pointer

本文介绍两种复制带有随机指针链表的方法:一种是通过vector存储节点并设置随机指针;另一种利用哈希表实现,适用于带环链表的复制。这两种方法能够有效地解决复杂链表的深拷贝问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法1:

先将节点放入vector中,先连接好每个节点的random。

class Solution {
public:
    int getNum(RandomListNode* head,RandomListNode* p)
    {
        if(p==NULL)
            return -1;
        int cnt=1;
        RandomListNode* ph=head;
        while(ph&&p!=ph)
        {
            ph=ph->next;
            cnt++;
        }
        return cnt;
    }
    
    void SetRandom(vector<RandomListNode*>& vec,RandomListNode* p,int cnt)
    {
        if(cnt==-1)
        {
            p->random=NULL;
            return;
        }
        int _size=vec.size();
        int len=cnt;
        while(len>_size)
        {
            RandomListNode* p=new RandomListNode(INT_MAX);
            vec.push_back(p);
            len--;
        }
        p->random=vec[cnt-1];
    }
    
    RandomListNode *copyRandomList(RandomListNode *head) {
        RandomListNode* Head=NULL,*pre=Head;
        RandomListNode* cur=head;
        if(head==NULL)
            return Head;
        vector<RandomListNode*> vec;
        int i=1;
        while(cur)
        {
            if(vec.size()<i)
            {
                RandomListNode *p=new RandomListNode(cur->label);
                vec.push_back(p);
                int cnt=getNum(head, cur->random);
                SetRandom(vec,p,cnt);
            }
            else
            {
                vec[i-1]->label=cur->label;
                int cnt=getNum(head, cur->random);
                SetRandom(vec,vec[i-1],cnt);
            }
            cur=cur->next;
            i++;
        }
        int _size=vec.size();
        Head=vec[0];
        pre=Head;
        for(i=1;i<_size;i++)
        {
            pre=pre->next=vec[i];
        }
        pre->next=NULL;
        return Head;
    }
}; 

方法2:

使用哈希表unordered_map

还可以轻松拷贝带环的list

class Solution {
public:
    RandomListNode *copyRandomList(RandomListNode *head) {
        if(head==NULL)
            return NULL;
        
        unordered_map<RandomListNode*, RandomListNode*> mp;
        RandomListNode *Head=new RandomListNode(head->label),*pre=Head,*cur=head;
        mp[cur]=pre;
        while(cur->next)
        {
            RandomListNode* p=new RandomListNode(cur->next->label);
            if(mp.find(cur->next)==mp.end())
                mp[cur->next]=p;
            else
                break;
            pre=pre->next=p;
            cur=cur->next;
        }
        RandomListNode* sta=NULL;
        if(cur->next==NULL)
            pre->next=NULL;
        else
            pre->next=sta=cur->next;
        cur=head;
        int cnt=0;
        while(cur)
        {
            RandomListNode* p=cur->random;
            if(p==NULL)
            {
                mp[cur]->random=NULL;
            }
            else
            {
                mp[cur]->random=mp[p];
            }
            cur=cur->next;
            if(cur==sta)
                cnt++;
            if(cnt>=2)
                break;
        }
        return Head;
        
    }
}; 


资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值