Java面试题-实现复杂链表的复制代码分享
阿里终面在线编程题,写出来与大家分享一下
有一个单向链表,每个节点都包含一个random指针,指向本链表中的某个节点或者为空,写一个深度拷贝函数,拷贝整个链表,包括random指针。尽可能考虑可能的异常情况。
算法如下:
/*
publicclassRandomListNode{
intlabel;
RandomListNodenext=null;
RandomListNoderandom=null;
RandomListNode(intlabel){
this.label=label;
}
}
*/
publicclassSolution{
publicRandomListNodeClone(RandomListNodepHead)
{
copyNodes(pHead);
setClonedNodes(pHead);
returnsplitNodes(pHead);
}
//第一步,复制链表任意结点N并创建新结点N‘,再把N'链接到N的后面
publicstaticvoidcopyNodes(RandomListNodehead){
RandomListNodetemp=head;
while(temp!=null){
RandomListNodeclonedNode=newRandomListNode(0);
clonedNode.next=temp.next;
clonedNode.label=temp.label;
clonedNode.random=null;
temp.next=clonedNode;
temp=clonedNode.next;
}
}
//第二步,设置复制出来的结点
publicstaticvoidsetClonedNodes(RandomListNodehead){
RandomListNodepNode=head;
while(pNode!=null){
RandomListNodepCloned=pNode.next;
if(pNode.random!=null){
pCloned.random=pNode.random.next;
}
pNode=pCloned.next;
}
}
//第三步,将第二步得到的链表拆分成两个链表
publicstaticRandomListNodesplitNodes(RandomListNodehead){
RandomListNodepNode=head;
RandomListNodeclonedHead=null;
RandomListNodeclonedNode=null;
if(pNode!=null){
clonedHead=pNode.next;
clonedNode=pNode.next;
pNode.next=clonedNode.next;
pNode=pNode.next;
}
while(pNode!=null){
clonedNode.next=pNode.next;
clonedNode=clonedNode.next;
pNode.next=clonedNode.next;
pNode=pNode.next;
}
returnclonedHead;
}
}
总结
以上就是本文关于Java面试题-实现复杂链表的复制代码分享的全部内容,感兴趣的朋友可以继续参阅:Java输出链表倒数第k个节点、Java语言实现反转链表代码示例、Java编程实现从尾到头打印链表代码实例以及本站其他相关专题,希望对大家有所帮助。如有不足之处,欢迎留言指出,小编一定及时更正,给大家提供更好的阅读体验及帮助,感谢朋友们对本站的支持!