题目链接地址:
题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
输入:
输入可能包含多个测试样例,输入以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
解题思路:
与普通链表相比,复杂链表多了一个指向任意结点的特殊指针。
因此我想到了以下解法:
大致分两步走,首先对每个链表结点的数据域和指向下一个结点的指针域进行赋值,然后再对每个链表结点的特殊指针域进行赋值。具体步骤如下:
(1) 申请一个链表结点指针数组,用于存放各个链表结点的地址;
(2) 构造链表的头结点,并且将头结点的数据域赋值为0;
(3) 每构造一个新结点,就将该结点插入到链表末尾,并且将该结点的地址保存到链表结点指针数组中;
(4) 待所有结点都插入到链表中后,从头开始重新遍历链表,对链表结点的特殊指针进行赋值。
特殊指针赋值的方法是如果特殊指针指向某个结点Ti,则从链表结点指针数组中取出Ti结点的地址并赋值给特殊指针;如果Ti=0,则将特殊指针指向链表的头结点。
AC代码如下:
#include<stdio.h>
#include<malloc.h>
#define MAX 1001
// 定义链表结点结构
typedef struct LinkNode
{
int data;
LinkNode * next; // 指向链表中的当前结点的下一个结点
LinkNode * specialPoint; // 特殊指针
}Linklist;
Linklist * LinkNodeAddress[MAX]; // 开一个指针数组,用于保存链表中各个的结点地址
/**
* 构造复杂链表
* @param n 复杂链表的结点个数
* @return head 复杂链表的头指针
*/
Linklist * createComplexLinklist(int n)
{
Linklist * head = (Linklist *)malloc(sizeof(Linklist)); // 链表的头结点
head -> data = 0; // 将头结点的数据域赋值为0,head既当头结点,又当NULL
head -> next = NULL;
Linklist * p = head; // p指针指向链表的最后一个结点
Linklist * s = NULL; // 新构造的链表结点
int i;
int data;
int Ti; // 表示链表结点的另一个指针的指向
// 构造链表结点的值和指向下一个结点的指针
for(i = 1;i <= n;i++)
{
scanf("%d",&data);
s = (Linklist *)malloc(sizeof(Linklist));
s -> data = data;
s -> next = p -> next;
p -> next = s; // 将s结点插入到链表末尾
p = s; // p始终指向当前链表的最后一个结点
LinkNodeAddress[i] = s; // 将s结点的地址保存到链表结点地址数组中
}
// 构造链表结点的特殊指针值
p = head -> next;
for(i = 1;i <= n;i++)
{
scanf("%d",&Ti);
if(0 != Ti)
{
p -> specialPoint = LinkNodeAddress[Ti];
}
else
{
p -> specialPoint = head; // 如果Ti == 0,则将特殊指针指向头结点(此时头结点等价于NULL)
}
p = p -> next;
}
return head;
}
/**
* 打印复杂链表
* @param head 复杂链表头指针
* @return void
*/
void printComplexLinklist(Linklist * head)
{
Linklist * p = head -> next;
while(p != NULL)
{
printf("%d %d\n",p -> data,p -> specialPoint -> data);
p = p -> next;
}
}
int main()
{
int n;
Linklist * head = NULL;
while(EOF != scanf("%d",&n))
{
head = createComplexLinklist(n);
printComplexLinklist(head);
}
return 0;
}
/**************************************************************
Problem: 1524
User: blueshell
Language: C++
Result: Accepted
Time:40 ms
Memory:1160 kb
****************************************************************/