一个链表问题:复制带随机指针的链表

本文介绍了一种特殊的链表复制方法,该链表包含next及random两种指针。提出了两种O(n)时间复杂度的解决方案:一是通过两次扫描完成复制及random指针设置;二是先将复制节点插入原节点间再进行random指针复制。
摘要由CSDN通过智能技术生成
   

题目:有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制这个链表的结构并分析其复杂性

 

解决方法一:

O(n)的复杂度,扫面两边即可。

                                                                 图【1】
图【1】是需要复制的链表


                                                              图【2】

如图【2】所示,ABCD是原来的链表,A’B’C’D’是复制的链表,第一遍扫描顺序复制next指针,把ABCD的next分别指向A’B’C’D’,将A’的next指针指向B,B’的next指针指向C,依次类推

复制random指针: A’->random=A->random->next

恢复:A->next=A’->next;A’->next=A’->next->next;

 

 

解决方法二:

也是O(n)的时间复杂度。。。


                                                                    图【3】

 

如图【3】,第一次遍历将要复制的链表A’ B’ C’ D’插入员链表中,然后再一次遍历复制random指针:A->next->random=A->random->next;

恢复很简单:A->next=A->next->next;A’-next=A’->next->next;

Reference: http://www.cppblog.com/yuech/archive/2011/04/02/143318.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值