输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
2017-10-05 10:42
1021 查看
本题源自LeetCode
--------------------------------------------
1 先复制节点,让复制节点插入节点的后面。
2 调整随机指针,复制节点的随机指针指向节点随机指针的下一个节点
3 将链表拆分开
RandomListNode *copyRandomList(RandomListNode *head) {
cloneListNode(head);
cloneRandom(head);
return reconnectNodes(head);
}
//复制节点,在节点的后面
void cloneListNode(RandomListNode *head){
RandomListNode *p=head;
while(p!=NULL){
RandomListNode *cloneNode=new RandomListNode(p->label)
a682
;
cloneNode->next=p->next;
cloneNode->random=NULL;
p->next=cloneNode;
p=cloneNode->next;
}
}
//复制随机指针
void cloneRandom(RandomListNode *head){
RandomListNode *p=head;
while(p!=NULL){
RandomListNode *cloneNode=p->next;
if(p->random!=NULL)
cloneNode->random=p->random->next;
p=cloneNode->next;
}
}
//拆分链表
RandomListNode* reconnectNodes(RandomListNode* head){
if(head == NULL)
return NULL;
RandomListNode* p=head;
RandomListNode *cloneHead=p->next;
RandomListNode *cloneNode=cloneHead;
p->next=cloneNode->next;
p=p->next;
while(p!=NULL){
cloneNode->next=p->next;
cloneNode=cloneNode->next;
p->next=cloneNode->next;
p=p->next;
}
return cloneHead;
}
--------------------------------------------
1 先复制节点,让复制节点插入节点的后面。
2 调整随机指针,复制节点的随机指针指向节点随机指针的下一个节点
3 将链表拆分开
RandomListNode *copyRandomList(RandomListNode *head) {
cloneListNode(head);
cloneRandom(head);
return reconnectNodes(head);
}
//复制节点,在节点的后面
void cloneListNode(RandomListNode *head){
RandomListNode *p=head;
while(p!=NULL){
RandomListNode *cloneNode=new RandomListNode(p->label)
a682
;
cloneNode->next=p->next;
cloneNode->random=NULL;
p->next=cloneNode;
p=cloneNode->next;
}
}
//复制随机指针
void cloneRandom(RandomListNode *head){
RandomListNode *p=head;
while(p!=NULL){
RandomListNode *cloneNode=p->next;
if(p->random!=NULL)
cloneNode->random=p->random->next;
p=cloneNode->next;
}
}
//拆分链表
RandomListNode* reconnectNodes(RandomListNode* head){
if(head == NULL)
return NULL;
RandomListNode* p=head;
RandomListNode *cloneHead=p->next;
RandomListNode *cloneNode=cloneHead;
p->next=cloneNode->next;
p=p->next;
while(p!=NULL){
cloneNode->next=p->next;
cloneNode=cloneNode->next;
p->next=cloneNode->next;
p=p->next;
}
return cloneHead;
}
相关文章推荐
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 21.输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
- java实现输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
- 一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个rand指针指向这个链表中的一个随机节点或NULL,现在要求复制一个单链表来实现这个链表,返回复制后的新链表。
- 有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?
- 给定一个链表,链表的每一个节点包含三个属性:1、节点值;2、指向下一个结点的引用;3、随机指向链表内任意一个节点的引用,也能不指向任何节点。复制该链表
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 给出两个表示两个非负整数的非空链表。数字以相反的顺序存储,它们的每个节点都包含一个数字。添加两个数字,并将其作为链接列表返回。
- [阿里巴巴2015校园招聘]写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。 .
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 若用链表存储一棵二叉树时,每个节点除数据域外,还有指向左孩子和右孩子的两个指针,在这种存储结构中,n歌节点的二叉树共有2N个指针域,其中有N-1个指针域存放了地址,有N+1个指针是空指针。
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。
- 链式A+B有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。 给定两个链表ListNode* A,ListN
- 今天开始学Java 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。使用非递归方法以及递归方法。