题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
输入:
输入可能包含多个测试样例,输入以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
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
输入:
输入可能包含多个测试样例,输入以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
推荐指数:※※
来源:http://ac.jobdu.com/problem.php?pid=1524
这道题如果OJ的角度来说,就失去了题目本身的意义。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF){
int *link=new int [n+1];
int *r=new int [n+1];
for(i=1;i<=n;i++)
scanf("%d",&link[i]);
for(i=1;i<=n;i++)
scanf("%d",&r[i]);
for(i=1;i<=n;i++){
printf("%d %d\n",link[i],r[i]>0?link[r[i]]:0);
}
}
return 0;
}
题目的关键是复制链表的时候有一任意指针。关于任意指针的处理,可以使用在源链表的每一个节点后面先插入一个节点,然后对值进行复制。源链表每一个任意指针处理时,在新的节点中,就是指向原来任意指针后面一个节点。(主要函数:)详细的参见海涛的博客:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/
typedef struct node{
int val;
node *next;
node *rnext;
}node;
bool copy_link(node* link,node *cp){
if(link==NULL)
return false;
node *p=link;
while(p!=NULL){
node *q=p->next;
node *c=new node;
p->next=c;
c->next=q;
p=p->next;
}
p=link;
while(p!=NULL){
node *q=p->next;
q->val=p->val;
q->rnext=p->rnext->next;
p=p->next;
}
p=link;
cp=link->next;
while(p!=NULL){
node *q=p->next;
p->next=p->next->next;
p=q->next;
q->next=q->next->next;
}
return true;
}