题目1524:复杂链表的复制-九度

题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
输入:
输入可能包含多个测试样例,输入以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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值