链表面试题之链表的拷贝
链表的拷贝,不是拷贝构造函数,也不是赋值函数,而是一个比较特殊的链表节点引起的问题。
题目如下:
有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何copy这个链表?
链表节点结构为
1 struct List
2 {
3 struct List* data;
4 struct List* next;
5 };
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中的数据copy入q中,然后再将要插入的数据记录在p中。
http://www.diybl.com/course/3_program/c++/cppsl/20071226/93621.html#
http://blog.csdn.net/zjumath/archive/2009/03/20/4008719.aspx