剑指offer题24

来源:互联网 发布:窗户漏风 知乎 编辑:程序博客网 时间:2024/06/05 02:12
package jianzhioffer;/**复杂链表的复制: * 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点), * 返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) * */class RandomListNode {    int label;    RandomListNode next = null;    RandomListNode random = null;    RandomListNode(int label) {        this.label = label;    }}public class Solution24 { /*public static RandomListNode Clone(RandomListNode pHead){ RandomListNode clone = pHead; return clone; }*///递归方法:转化为一个头结点和除去头结点的剩余部分,剩余部分操作和原问题一致 public static RandomListNode Clone(RandomListNode pHead){ if(pHead == null){ return null; } //开辟新节点,作为头节点 RandomListNode clone = new RandomListNode(pHead.label); clone.next = pHead.next; clone.random = pHead.random; //递归处理剩余部分节点 clone.next = Clone(pHead.next);  return clone; }//三步法:1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;//     2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;//     3、拆分链表,将链表拆分为原链表和复制后的链表/*public static RandomListNode Clone(RandomListNode pHead) {if(pHead == null){return null;}RandomListNode currentNode = pHead;while(currentNode != null){RandomListNode clone = new RandomListNode(currentNode.label);clone.next = currentNode.next;currentNode.next = clone;currentNode = clone.next;}currentNode = pHead;while(currentNode != null){if(currentNode.random == null){currentNode.next.random = null;}else{currentNode.next.random = currentNode.random.next;}//currentNode.next.random = currentNode.random==null?null:currentNode.random.next;currentNode = currentNode.next.next;}currentNode = pHead;RandomListNode  pclone = pHead.next;while(currentNode != null){RandomListNode clone = currentNode.next;currentNode.next = clone.next;clone.next = clone.next == null?null:clone.next.next;currentNode = currentNode.next;}return pclone;}*/ public static void main(String[] args) {RandomListNode pHead = new RandomListNode(2);RandomListNode node1 = new RandomListNode(0);RandomListNode node2 = new RandomListNode(1);RandomListNode node3 = new RandomListNode(7);RandomListNode node4 = new RandomListNode(4);RandomListNode node5 = new RandomListNode(5);pHead.next = node1;pHead.random = node4;node1.next = node2;node1.random = node3;node2.next = node3;node2.random = node5;node3.next = node4;node3.random = node2;node4.next = node5;node4.random = node1;node5.next = null;node5.random =null;/*//根据next输出原始链表:201745while(pHead!= null){System.out.println(pHead.label);pHead = pHead.next;}*//*//根据random输出原始链表:240715while(pHead!= null){System.out.println(pHead.label);pHead = pHead.random;}*/    RandomListNode clone = Clone(pHead);        //根据next输出复制的链表while(clone!= null){System.out.println(clone.label);clone = clone.next;}//根据random输出复制的链表while(clone!= null){System.out.println(clone.label);clone = clone.random;}    }}

原创粉丝点击