面试题26 复杂链表的复制

来源:互联网 发布:星辰0灯尤格萨隆数据 编辑:程序博客网 时间:2024/05/22 17:57

题目:

请实现函数ComplexListNode(LinkNode head),复制一个复杂链表。在复杂链表中,出了有Next指针意外,还有一个Sibling指向链表中的任意节点或者Null,节点定义如下:

public  class LinkNode{public int data;public LinkNode next;public LinkNode subLing;}

输入:

头插法的单链表序列(4,3,2,1)

输出:

4321

解题思路:

1、复制链表到单链表序列的后面

2、辅助Sibling的值

3、把一个链表分解成两个

Java实现代码:

public static void main(String[] args) {// TODO Auto-generated method stubLinked linked=new Linked();LinkNode node1=new LinkNode(4);LinkNode node2=new LinkNode(3);LinkNode node3=new LinkNode(2);LinkNode node4=new LinkNode(1);node1.subLing=node3;node1.subLing=node1;linked.insertFirst(node1);linked.insertFirst(node2);linked.insertFirst(node3);linked.insertFirst(node4);linked.display(ComplexListNode(linked.header));}private static LinkNode ComplexListNode(LinkNode node){cloneNode(node);setCloneNodeSiblin(node);return ReconnectNode(node);}//复制链表到后面private static void cloneNode(LinkNode header){if(header==null){return;}LinkNode temp=header;while(temp!=null){LinkNode cloneNode=new LinkNode();cloneNode.data=temp.data;cloneNode.next=temp.next;cloneNode.subLing=null;cloneNode.next=temp.next;temp.next=cloneNode;temp=cloneNode.next;}}//设置节点sibling值private static void setCloneNodeSiblin(LinkNode header){if(header==null){return;}LinkNode temp=header;while(temp!=null){LinkNode cloneNode=temp.next;if(temp.subLing!=null){cloneNode.subLing=temp.subLing.next;}temp=cloneNode.next;}}//分个两个链表private static LinkNode ReconnectNode(LinkNode head){LinkNode cloneheader=null;LinkNode temp=head;LinkNode cloneNode=null;if(temp!=null){cloneheader=cloneNode=temp.next;temp=cloneNode.next;}while(temp!=null){cloneNode.next=temp.next;cloneNode=cloneNode.next;temp=cloneNode.next;}return cloneheader;}



0 0
原创粉丝点击