M1: 复制带随机指针的链表
来源:互联网 发布:美工抠图总结 编辑:程序博客网 时间:2024/05/01 08:30
一个链表问题:复制带随机指针的链表
题目:有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制这个链表的结构并分析其复杂性
解决方法一:
O(n)的复杂度,扫面两边即可。
图【1】
图【1】是需要复制的链表
图【2】
如图【2】所示,ABCD是原来的链表,A’B’C’D’是复制的链表,第一遍扫描顺序复制next指针,把ABCD的next分别指向A’B’C’D’,将A’的next指针指向B,B’的next指针指向C,依次类推
复制random指针: A’->random=A->random->next
恢复:A->next=A’->next;A’->next=A’->next->next;
package careercup;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;public class RandomList {public static RandomList single = new RandomList();public RandomList() {}public static void main(String[] args) {int[] arr = new int[]{1,3,5,7};RandomNode head = RandomNode.createList(arr); head.randomNext = (RandomNode)head.next.next;((RandomNode)head.next).randomNext = (RandomNode)head.next.next.next;RandomNode rn = single.getList(head);printList(rn);//printList(head);}private static void printList(RandomNode rn) {while(rn!=null){System.out.print(rn);System.out.print(", ");rn = (RandomNode)rn.next;}}public RandomNode getList(RandomNode rn) {RandomNode head = rn;RandomNode p=null;while(rn!=null){p = new RandomNode(rn);p.next = rn.next;rn.next = p;rn = (RandomNode)p.next;}p = (RandomNode)head.next;while(p!=null){p.randomNext = p.randomNext!=null ? (RandomNode)p.randomNext.next : null;if(p.next!=null) p = (RandomNode)p.next.next;else break;}rn = head;head = (RandomNode)head.next;p = head;rn.next = p.next;while(rn.next!=null){p.next = (RandomNode)p.next.next;p = (RandomNode)p.next;rn.next = p.next;}return head;}}class RandomNode extends Node{RandomNode randomNext;RandomNode(int val) {super(val);randomNext = null;}RandomNode(RandomNode rn){super(rn.val);this.next = rn.next;this.randomNext = rn.randomNext;}public static RandomNode createList(int[] arr) {RandomNode head = new RandomNode(arr[0]);RandomNode p = head;for(int i=1; i<arr.length;i++){p.next = new RandomNode(arr[i]);p = (RandomNode)p.next;}return head;}public String toString(){return "[" + val + "(" + randomNext + ")]"; }}
- M1: 复制带随机指针的链表
- 复制带随机指针的链表
- 复制带随机指针的链表
- 复制带随机指针的链表
- 复制带随机指针的链表
- 复制带随机指针的链表
- 复制带随机指针的链表
- 复制带随机指针的链表
- 带随机指针的链表复制问题
- 复制一个带随机指针的链表
- LintCode复制带随机指针的链表
- 题目:复制带随机指针的链表
- LintCode(105) 复制带随机指针的链表
- LintCode:复制带随机指针的链表
- lintcode,复制带随机指针的链表
- lintcode,复制带随机指针的链表
- LintCode(M) 复制带随机指针的复杂链表
- LintCode 105-复制带随机指针的链表
- hadoop学习笔记之-NFS配置
- 关于视频直播系统
- Java 枚举常见种用法
- eclipse配置jdk的src.zip
- Jenkins简单使用介绍
- M1: 复制带随机指针的链表
- 让MFC消息反射机制原型毕露-------(Message Reflection)
- nginx 配置 详解(待指点/更新)
- 8051单片机I/O引脚工作原理(P2端口修改指明)
- 数据迁移:RAC 下开启关闭归档
- C语言学习(六)指针1 概念
- GetPrivateProfileInt
- 特创论
- HDOJ 1251 -- 统计难题 Trie