【LeetCode】Copy List with Random Pointer
来源:互联网 发布:大数据时代txt微盘 编辑:程序博客网 时间:2024/06/16 12:42
题目:
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
分析:我们知道如果是简单的copy List 的话,那么我们只需要从头到尾遍历下来,new出对应个数的Node,并把它们的连接关系设置好就可以了,但是这道题目中每个节点Node出现了Random属性,也就意味着可能当前结点Node所依赖的那个Random对应的结点还没有被创建出来。
解题思路:
为了解决“分析”里提到的问题,我们需要做如下三步处理!
1. 在OldList中的每个结点后,插入一个CopyNode,这个结点的Random域和Next域与OldList中的被拷贝Node的Random域和Next一致,然后让被拷贝结点的Next域指向CopyNode结点,这样先创建出OldList中结点对应的CopyNode结点。
2. 由于所有的CopyNode都已经创建出来了,我们就可以调整这些CopyNode真正的Random域的值了。
3. 调整所有CopyNode的Next域的值,恢复OldList所有Node的Next的值到初始状态!
不能把第二步和第三部一起来处理,因为后面的结点可以指到前面,而前面的结点已经断开了,其random指针的next是原来的List,故报错。
package copylist;class RandomListNode { int label; RandomListNode next, random; RandomListNode(int x) { this.label = x; }};public class Solution { public RandomListNode copyRandomList(RandomListNode head) { if (head == null) return head; /*第一步:在OldList的每个节点后面都插入一个copyNode(拷贝链表的结点)*/ RandomListNode nowNode = head; while (nowNode != null){ RandomListNode copyNode = new RandomListNode(nowNode.label); copyNode.random = nowNode.random; copyNode.next = nowNode.next; nowNode.next = copyNode; nowNode = nowNode.next.next; } /*第二步:确定NewList的每个节点,真正关联到的Random结点是哪个, * 因为第一步已经把所有NewList上的结点都建立了*/ nowNode = head; while (nowNode != null){ if (nowNode.random != null){ nowNode.next.random = nowNode.random.next; } nowNode = nowNode.next.next; } /*第三步:还原OldList的next为一开始的next结点 * 并拼接NewList的next到它真正所应该关联的next结点 * 即:保持老链表OldList不变,拼接新链表NewList! * */ RandomListNode pHead = new RandomListNode(0); pHead.next = head; RandomListNode newlist = pHead; nowNode = head; while (nowNode != null){ pHead.next = nowNode.next; nowNode.next = pHead.next.next; pHead = pHead.next; nowNode = nowNode.next; } return newlist.next; }}
0 0
- [leetcode][list] Copy List with Random Pointer
- Leetcode: Copy List with Random Pointer
- LeetCode: Copy List with Random Pointer
- [LeetCode] Copy List with Random Pointer
- [leetcode]Copy List with Random Pointer
- LeetCode:Copy List with Random Pointer
- leetcode Copy List with Random Pointer
- LeetCode:Copy List with Random Pointer
- LeetCode题解:Copy List with Random Pointer
- [LeetCode]Copy List with Random Pointer
- leetcode Copy List with Random Pointer
- leetcode-Copy List with Random Pointer
- Leetcode: Copy List with Random Pointer
- LeetCode | Copy List with Random Pointer
- [LeetCode] Copy List with Random Pointer
- LeetCode OJ:Copy List with Random Pointer
- LeetCode(138)Copy List with Random Pointer
- [LeetCode] - Copy List with Random Pointer
- php图片上传并生成缩略图
- vim
- Myeclipse 10 for mac 破解版下载安装及破解方法
- 第十四周项目6阅读程序
- (软件工程总结)之编码
- 【LeetCode】Copy List with Random Pointer
- Sublime Text 2 使用心得
- 扬声器程序设计
- MAC下如何配置Android手机调试(将测试手机加入到Mac系统的调试列表中)
- 我的博客搬到博客园啦!
- 14周项目二
- Apache虚拟主机配置
- HEVC代码追踪(十):量化->xCheckIntraPCM
- Popush迭代1总结