题目1524:复杂链表的复制
时间限制:1 秒内存限制:128 兆特殊判题:否提交:606解决:292
题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n (1<=n<=1000):n代表将要输入的链表元素的个数。(节点编号从1开始)。
接下来有n个数,表示链表节点中的值。
接下来有n个数Ti,Ti表示第i个节点的另一个指针指向。
Ti = 0 表示这个指针为NULL。
输出:
对应每个测试案例,
输出n行,每行有二个数,第一个代表当前节点值,第二个代表当前节点的特殊指针的值。
样例输入:
5
1 2 3 4 5
3 5 0 2 0
样例输出:
1 3
2 5
3 0
4 2
5 0
#include <iostream>
#include<stdio.h>
using namespace std;
struct ListNode{
int value;
ListNode* next;
ListNode* random_link;
};
int main(){
int n,num;
while(scanf("%d",&n)!=EOF){
ListNode* nodes = new ListNode[n+1];
for(int i=1;i<=n;i++){
scanf("%d",&nodes[i].value);
nodes[i].next = NULL;
nodes[i].random_link = NULL;
}
for(int i=1;i<=n;i++){
scanf("%d",&num);
if(num>0)
nodes[i].random_link = &nodes[num];
}
for(int i=1;i<=n;i++){
printf("%d %d\n",nodes[i].value,nodes[i].random_link!=NULL?nodes[i].random_link->value:0);
}
}
return 0;
}
#include <iostream>
#include<stdio.h>
using namespace std;
struct ListNode{
int value;
ListNode* next;
ListNode* random_link;
};
//step1 复制节点
void cloneNodes(ListNode* pHead){
ListNode* pNode = pHead;
while(pNode!=NULL){
ListNode* pClone = new ListNode();
pClone->value = pNode->value;
pClone->next = pNode->next;
pClone->random_link = NULL;
pNode->next = pClone;
pNode = pClone->next;
}
}
void connectRandomNodes(ListNode* pHead){
ListNode* pNode = pHead;
while(pNode){
ListNode* pClone = pNode->next;
if(pNode->random_link!=NULL){
pClone->random_link = pNode->random_link->next;
}
pNode = pClone->next;
}
}
ListNode* reconnentNodes(ListNode* pHead){
ListNode* pNode = pHead;
ListNode* pCloneHead = NULL;
ListNode* pCloneNode = NULL;
if(pNode!=NULL){
pCloneHead = pCloneNode = pNode->next;
pNode->next = pCloneNode->next;
pNode = pNode->next;
}
while(pNode){
pCloneNode->next = pNode-next;
pCloneNode = pCloneNode->next;
pNode->next = pCloneNode->next;
pNode = pNode->next;
}
return pCloneHead;
}
//将上面三步合起来
ListNode* clone(ListNode* pHead){
cloneNodes(pHead);
connectRandomNodes(pHead);
return reconnentNodes(pHead);
}
int main(){
return 0;
}