【剣指Offer面接問題】九度OJ 1524:複雑なチェーンテーブルのコピー
4304 ワード
タイトルリンクアドレス:http://ac.jobdu.com/problem.php?pid=1524
タイトル1524:複雑なチェーンテーブルのコピー
時間制限:1秒メモリ制限:128メガ特殊判定:Noコミット:751解決:359問題説明:複雑なチェーンテーブルを入力します(各ノードにノード値があり、2つのポインタ、1つは次のノード、もう1つの特殊ポインタは任意のノードを指します).入力:入力には複数のテストサンプルが含まれ、入力はEOFで終了します.各テストケースについて、入力される第1の動作の整数n(1<=n<=1000):nは、入力するチェーンテーブル要素の個数を表す.(ノード番号は1から).チェーンテーブルノードの値を表すn個の数が続く.次にn個の数Tiがあり,Tiはi番目のノードの別のポインタ指向を表す.Ti=0はこのポインタがNULLであることを示す.出力:各テストケースに対応して、n行を出力します.各行には2つの数があり、1つ目は現在のノード値、2つ目は現在のノードを表す特殊なポインタの値です.サンプル入力:5 1 2 3 4 5 5 0 2 0サンプル出力:1 3 2 5 3 4 5 0
構想分析:
ACという問題には、いろいろな方法があります.直接チェーンテーブルノードポインタ配列が実現され、pSiblingポインタがあるノードSを指すと、チェーンテーブルノードポインタ配列からSノードのアドレスを取り出し、pSiblingポインタに値を付与する.もちろん私たちはやはり本の2つの方法を学ぶべきです.
コード:
タイトル1524:複雑なチェーンテーブルのコピー
時間制限:1秒メモリ制限:128メガ特殊判定:Noコミット:751解決:359問題説明:複雑なチェーンテーブルを入力します(各ノードにノード値があり、2つのポインタ、1つは次のノード、もう1つの特殊ポインタは任意のノードを指します).入力:入力には複数のテストサンプルが含まれ、入力はEOFで終了します.各テストケースについて、入力される第1の動作の整数n(1<=n<=1000):nは、入力するチェーンテーブル要素の個数を表す.(ノード番号は1から).チェーンテーブルノードの値を表すn個の数が続く.次にn個の数Tiがあり,Tiはi番目のノードの別のポインタ指向を表す.Ti=0はこのポインタがNULLであることを示す.出力:各テストケースに対応して、n行を出力します.各行には2つの数があり、1つ目は現在のノード値、2つ目は現在のノードを表す特殊なポインタの値です.サンプル入力:5 1 2 3 4 5 5 0 2 0サンプル出力:1 3 2 5 3 4 5 0
構想分析:
ACという問題には、いろいろな方法があります.直接チェーンテーブルノードポインタ配列が実現され、pSiblingポインタがあるノードSを指すと、チェーンテーブルノードポインタ配列からSノードのアドレスを取り出し、pSiblingポインタに値を付与する.もちろん私たちはやはり本の2つの方法を学ぶべきです.
コード:
/*********************************
【 Offer 】 OJ1524:
Author: Date:2015
Email:[email protected]
**********************************/
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAX 1005
//
typedef struct LinkNode
{
int data;
LinkNode * next; //
LinkNode * pSibling; //
}LinkNode;
LinkNode * nodeArray[MAX]; // ,
//
LinkNode * createComplexLinklist(int n)
{
LinkNode * head = (LinkNode *)malloc(sizeof(LinkNode)); //
head -> data = 0;
head -> next = NULL;
LinkNode * p = head;
LinkNode * s = NULL; //
int i,data,Ti;
//
for(i = 1;i <= n;i++) // 1
{
scanf("%d",&data);
s = (LinkNode *)malloc(sizeof(LinkNode));
s -> data = data;
s -> next = p -> next;
p -> next = s;
p = s;
nodeArray[i] = s; //
}
//
p = head -> next;
for(i = 1;i <= n;i++)
{
scanf("%d",&Ti);
if(0 != Ti)
{
p -> pSibling = nodeArray[Ti];
}
else
{
p -> pSibling = head;
}
p = p -> next;
}
return head;
}
/**
*
* @param head
* @return void
*/
void printComplexLinklist(LinkNode * head)
{
LinkNode * p = head -> next;
while(p != NULL)
{
printf("%d %d
",p -> data,p -> pSibling -> data);
p = p -> next;
}
}
int main()
{
int n;
LinkNode * head = NULL;
while(scanf("%d",&n)!= EOF )
{
head = createComplexLinklist(n);
printComplexLinklist(head);
}
return 0;
}
/**************************************************************
Problem: 1524
Language: C++
Result: Accepted
Time:40 ms
Memory:1160 kb
****************************************************************/