复杂链表的复制

问题:

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

结构体定义如下:

struct complex_node

{

int value;

struct complex_node *next;

struct complex_node *sibling;

};

复杂链表的复制_第1张图片

分析:

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

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

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

复杂链表的复制_第2张图片

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

复杂链表的复制_第3张图片

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

复杂链表的复制_第4张图片

代码见转载的博客。

总结:

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

摘自:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/


你可能感兴趣的:(复杂链表的复制)