您的位置:首页 > 其它

复杂链表的复制

2012-09-01 17:05 246 查看
问题:

有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。

结构体定义如下:

struct complex_node

{

int value;

struct complex_node *next;

struct complex_node *sibling;

};



分析:

简单的方法就是根据next,将所有的节点复制一遍,这个时间复杂度是O(n)的,然后计算sibling,由于sibling没有固定的位置,需要从头开始寻找,所以一个查找一个节点时间复杂度为O(n),如果有m个sibling,那么sibling所花的时间是O(m*n)。这里可以用hash的方式来快速寻找,但是空间复杂度会变为O(n),用空间换取时间。

另一种方法,这种方法来自《剑指offer》,算法分为三个步骤:

1,和上面的方法一样,复制根据next复制节点。但是这里讲复制好的节点直接跟在原节点之后,如下图所示:



2,复制sibling指针。这里方法比较简单了,碰到N节点,判断是否有sibling,如果有,那么将N'的sibling赋值N->sibling->next,比较好理解。



3,将新复制的链表和原链表分离。分离的话,根据next指针,奇数和偶数分开就行。



代码见转载的博客。

总结:

刚刚看到这种方法,太美妙了,如此简单、清晰的解决办法。

摘自:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: