链表面试题之链表的拷贝

链表的拷贝,不是拷贝构造函数,也不是赋值函数,而是一个比较特殊的链表节点引起的问题。

题目如下:

有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何copy这个链表?

链表节点结构为

1 struct   List   
2 {   
3     struct   List*   data;   
4     struct   List*   next;   
5 };  

其中next为下一个节点,data指向链表中的随机一个节点。

要求拷贝拥有链表节点元素为上面结构的一个链表。返回是一个新的链表。

其他要求为

1、新链表中节点的data指向新链表中对应节点,而非原链表中对应节点。

2、不能用缓存(如数组等),可用临时变量。   

3、必须为O(n) 

 

实现的思路很有意思。

在老的链表的每一个节点之后创建一个新的节点,其新的节点的data指针指向老的节点的data指针的next指向的那个节点。

然后再将新链表拆分出来。

这个思路很巧妙,以前没有怎么遇到过,就不容易想到。

整个实现代码如下:

Code

 

参考帖子地址:http://topic.csdn.net/t/20061117/22/5166965.html

 

【扩展】 

 这里面的思想也可以用于下面的题目

1. 给定链表的头指针和一个结点指针,在O(1)时间删除该结点。

试题代码

Code 

2. 只给定单链表中某个结点p(非空结点),在p前面插入一个结点。

办法与前者类似,首先分配一个结点q,将q插入在p后,接下来将p中的数据copyq中,然后再将要插入的数据记录在p中。


参考网址:

http://www.diybl.com/course/3_program/c++/cppsl/20071226/93621.html#

http://blog.csdn.net/zjumath/archive/2009/03/20/4008719.aspx 

 

posted on 2009-10-30 23:26  cnyao  阅读(1214)  评论(0编辑  收藏  举报