【LeetCode-面试算法经典-Java实现】【143-Copy List with Random Pointer(有随机指针的链表复制)】
2015-08-19 06:40
711 查看
【143-Copy List with Random Pointer(有随机指针的链表复制)】
【LeetCode-面试算法经典-Java实现】【所有题目目录索引】
原题
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.
题目大意
一个单链表包含一个指向任意结点或者null的结点指针,返回这个链表的深拷贝解题思路
第一步:复制结点,复制的结点放在待复制的结点后,依然组成一个单链表第二步:串接随机指针
第三步:链表拆分。拆成原链和复制链
代码实现
结点类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 null; } copyNode(head); linkRandomPointer(head); return splitList(head); } /** * 复制结点,复制的结点放在待复制的结点后,依然组成一个单链表 * * @param head 链表头 */ public void copyNode(RandomListNode head) { // 记录当前要被复制的缜 RandomListNode node = head; while (node != null) { // 复制一个新的结点 RandomListNode copyNode = new RandomListNode(node.label); // 将结点串接到被复制的结点后,并且依然组成单链表 copyNode.next = node.next; node.next = copyNode; node = copyNode.next; } } /** * 串接随机指针 * * @param head 链表头 */ public void linkRandomPointer(RandomListNode head) { // 记录当前要被复制的缜 RandomListNode node = head; while (node != null) { // 随机指针有指向某个具体的结点 if (node.random != null) { // 串接node被复制结点的随机指针 node.next.random = node.random.next; } // 指向下一个被复制的结点 node = node.next.next; } } /** * 将链表拆分,还原原来的链表,并且组装拷贝的链表 * * @param head 链表头 * @return 拷贝的新链表头 */ public RandomListNode splitList(RandomListNode head) { // 新链表头 RandomListNode copyHead = head.next; // 当前处理的被复制的结点 RandomListNode node = head; // 当前复制的结点 RandomListNode copy; while (node != null){ // 指向复制结点 copy = node.next; // node.next指向下一个被复制的结点 node.next = copy.next; // 下一个被复制的结点不为null if (node.next != null) { // copy.next指向下一个复制的结点 copy.next = node.next.next; } // node指向下一个要被处理的被复制结点 node = node.next; } return copyHead; } }
评测结果
点击图片,鼠标不释放,拖动一段位置,释放后在新的窗口中查看完整图片。特别说明
欢迎转载,转载请注明出处【/article/1324057.html】
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【142-Linked List Cycle II(单链表中有环II)】
- 【LeetCode-面试算法经典-Java实现】【141-Linked List Cycle(单链表中有环)】
- 【LeetCode-面试算法经典-Java实现】【139-Word Break(单词拆分)】
- 黑马程序员——黑苹果的日记(8)——oc基础之类和对象
- 黑马程序员——黑苹果的日记(11)—— oc加强
- [读书笔记—程序员]《高效程序员的45个习惯:敏捷开发修炼之道》- 苏帕拉马尼亚姆,亨特
- 黑马程序员——黑苹果的日记(6)——Foundation之NSString
- 黑马程序员——Java基础IO流概述、字符流、字节流、流操作规律、File类、Properties类、打印流、序列流
- 剑指offer面试题5-从尾到头打印链表/6-重建二叉树
- 每位新手程序员都应当了解的七条箴言
- 程序员该如何应对老板和客户的施压
- 10个经典的 Java main 方法面试题
- 9秒学院:每个程序员需掌握的20个代码命名小贴士
- 10+年程序员总结的20+条经验教训
- 一个程序员的成长独白
- 华为面试经验
- 每天五个java相关面试题(4)
- 剑指Offer面试题:4.从尾到头打印链表
- Java笔试面试题010
- PHP面试总结