﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-ccyy's coding zone-随笔分类-C/C++</title><link>http://www.cppblog.com/yuech/category/16246.html</link><description>往前走，不要留恋路边的风景.</description><language>zh-cn</language><lastBuildDate>Wed, 27 Apr 2011 03:51:56 GMT</lastBuildDate><pubDate>Wed, 27 Apr 2011 03:51:56 GMT</pubDate><ttl>60</ttl><item><title>一个链表问题：复制带随机指针的链表</title><link>http://www.cppblog.com/yuech/archive/2011/04/02/143318.html</link><dc:creator>ccyy</dc:creator><author>ccyy</author><pubDate>Sat, 02 Apr 2011 15:01:00 GMT</pubDate><guid>http://www.cppblog.com/yuech/archive/2011/04/02/143318.html</guid><wfw:comment>http://www.cppblog.com/yuech/comments/143318.html</wfw:comment><comments>http://www.cppblog.com/yuech/archive/2011/04/02/143318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yuech/comments/commentRss/143318.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yuech/services/trackbacks/143318.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;
<p><span><span>题目</span></span><span><span>:</span></span><span><span>有一个链表</span></span><span><span>L,</span></span><span><span>其每个节点有</span></span><span><span>2</span></span><span><span>个指针，一个指针</span></span><span><span>next</span></span><span><span>指向链表的下个节点，另一个</span></span><span><span>random</span></span><span><span>随机指向链表中的任一个节点，可能是自己或者为空，写一个程序，要求复制这个链表的结构并分析其复杂性</span></span><span></span></p>
<p><span>&nbsp;</span></p>
<p><span><span>解决方法一：</span></span><span></span></p>
<p><span><span>O(n)</span></span><span><span>的复杂度</span></span><span><span>,</span></span><span><span>扫面两边即可。<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/yuech/3.jpg"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图【1】<br>图【1】是需要复制的链表<br></span></span><span></span></p>
<p><img border=0 src="http://www.cppblog.com/images/cppblog_com/yuech/1.jpg"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图【2】</p>
<p><span>如图【2】所示，</span><span>ABCD</span><span>是原来的链表，</span><span>A&#8217;B&#8217;C&#8217;D&#8217;</span><span>是复制的链表，第一遍扫描顺序复制</span><span>next</span><span>指针，把</span><span>ABCD</span><span>的</span><span>next</span><span>分别指向</span><span>A&#8217;B&#8217;C&#8217;D&#8217;</span><span>，将</span><span>A&#8217;</span><span>的</span><span>next</span><span>指针指向</span><span>B</span><span>，</span><span>B&#8217;</span><span>的</span><span>next</span><span>指针指向</span><span>C</span><span>，依次类推</span></p>
<p><span>复制</span><span>random</span><span>指针：</span><span> A&#8217;-&gt;random=A-&gt;random-&gt;next</span></p>
<p><span>恢复</span><span>:A-&gt;next=A&#8217;-&gt;next;A&#8217;-&gt;next=A&#8217;-&gt;next-&gt;next;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>解决方法二：</span></p>
<p><span>也是</span><span>O(n)</span><span>的时间复杂度。。。</span></p>
<p align=left><img border=0 src="http://www.cppblog.com/images/cppblog_com/yuech/2.jpg"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图【3】</p>
<p>&nbsp;</p>
<p><span>如图【3】，第一次遍历将要复制的链表</span><span>A&#8217; B&#8217; C&#8217; D&#8217;</span><span>插入员链表中，然后再一次遍历复制</span><span>random</span><span>指针：</span><span>A-&gt;next-&gt;random=A-&gt;random-&gt;next;</span></p>
<p><span>恢复很简单：</span><span>A-&gt;next=A-&gt;next-&gt;next;A&#8217;-next=A&#8217;-&gt;next-&gt;next;<br><br><br><span style="COLOR: red">转载请注明出处。</span></span></p>
<img src ="http://www.cppblog.com/yuech/aggbug/143318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yuech/" target="_blank">ccyy</a> 2011-04-02 23:01 <a href="http://www.cppblog.com/yuech/archive/2011/04/02/143318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>