输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
2017-11-18 23:44
1081 查看
分析:在本题中我们将问题分开来求解,首先先将要复制的链表按照原链表的next的关系拼接成新的链表,然后再去处理random(根据原链表中的每一个节点random节点所在的步长)来进行拼接。
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
boolean flag=true;
RandomListNode newHead;//保存首节点
RandomListNode newPHead;//保存首节点
//定义准备复原的节点
RandomListNode new_PHead;
RandomListNode new_Head;
public RandomListNode Clone(RandomListNode pHead)
{
RandomListNode cHead=new RandomListNode(0);
if(pHead ==null){
return null;
}else if(pHead.next==null){
//只有一个节点
cHead.label=pHead.label;
return cHead;
}
cHead.label=pHead.label;
while(pHead.next !=null){
//首先拼接节点中的next指针
RandomListNode node=new RandomListNode(0);//创建新的节点
node.label=pHead.next.label;
cHead.next=node;
if(flag){
newHead=cHead;
newPHead=pHead;
flag=false;
}
cHead=node;
pHead=pHead.next;
}
//头结点复原
pHead=newPHead;
cHead=newHead;
new_PHead=newPHead;
new_Head=newHead;
//拼接节点中的random指针
while(newPHead !=null){
int index=0;
if(newPHead.random !=null){
//统计步长
RandomListNode node_random=newPHead.random;
while(pHead !=node_random){
index++;
pHead=pHead.next;
}
for(int i=0;i<index;i++){
newHead=newHead.next;
}
cHead.random=newHead;
//复原头结点
newHead=new_Head;
pHead=new_PHead;
}
newPHead=newPHead.next;
cHead=cHead.next;
}
return new_Head;
}
}
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
boolean flag=true;
RandomListNode newHead;//保存首节点
RandomListNode newPHead;//保存首节点
//定义准备复原的节点
RandomListNode new_PHead;
RandomListNode new_Head;
public RandomListNode Clone(RandomListNode pHead)
{
RandomListNode cHead=new RandomListNode(0);
if(pHead ==null){
return null;
}else if(pHead.next==null){
//只有一个节点
cHead.label=pHead.label;
return cHead;
}
cHead.label=pHead.label;
while(pHead.next !=null){
//首先拼接节点中的next指针
RandomListNode node=new RandomListNode(0);//创建新的节点
node.label=pHead.next.label;
cHead.next=node;
if(flag){
newHead=cHead;
newPHead=pHead;
flag=false;
}
cHead=node;
pHead=pHead.next;
}
//头结点复原
pHead=newPHead;
cHead=newHead;
new_PHead=newPHead;
new_Head=newHead;
//拼接节点中的random指针
while(newPHead !=null){
int index=0;
if(newPHead.random !=null){
//统计步长
RandomListNode node_random=newPHead.random;
while(pHead !=node_random){
index++;
pHead=pHead.next;
}
for(int i=0;i<index;i++){
newHead=newHead.next;
}
cHead.random=newHead;
//复原头结点
newHead=new_Head;
pHead=new_PHead;
}
newPHead=newPHead.next;
cHead=cHead.next;
}
return new_Head;
}
}
相关文章推荐
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
- 21.输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
- java实现输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
- 有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?
- 一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个rand指针指向这个链表中的一个随机节点或NULL,现在要求复制一个单链表来实现这个链表,返回复制后的新链表。
- 给定一个链表,链表的每一个节点包含三个属性:1、节点值;2、指向下一个结点的引用;3、随机指向链表内任意一个节点的引用,也能不指向任何节点。复制该链表
- java 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- [阿里巴巴2015校园招聘]写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。 .
- 《剑指Offer》输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 【剑指offer24】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。