【剑指offer】复杂链表的复制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691


题目描述:

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。

输入:

输入可能包含多个测试样例,输入以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 

这道题目,鉴于题目的测试要求,我这里用数组实现,话说用数组实现实在是太简单了,而且时间复杂度为O(n),没有体现出剑指offer上的思路的好处,要看链式存储的实现思路,参考剑指offer!

另外,被测试用了给忽悠了,第一次提交,报了WA,我测试了几组用例,都没错,OJ上居然一组都没通过,后来试了下将输出的的第二个数据由节点编号变为了节点数值,结果AC了,这确实有点坑了,主要是样例给的太不好了,很容易产生歧义!

AC代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
	int data;
	int index;	//节点编号(从1开始计算)
	int pNext;
	int pSibling;	//特殊指针
}Node;

/*用数组实现非常简单*/
void CloneList(Node *pHead,Node *pClone,int len)
{
	if(pHead == NULL)
		return;
	int i;
	for(i=1;i<len;i++)
	{
		pClone[i].data = pHead[i].data;
		pClone[i].index = pHead[i].index;
		pClone[i].pNext = pHead[i].pNext;
		pClone[i].pSibling = pHead[i].pSibling;
	}
}

int main()
{
	int n;
	while(scanf("%d",&n) != EOF)
	{
		Node *pHead = NULL;
		if(n>0)
		{
			//开辟n+1各节点空间,空出来第一个,这样节点编号就从1开始
			pHead = (Node *)malloc((n+1)*sizeof(Node));
			if(pHead == NULL)
				exit(EXIT_FAILURE);
			int i,data;
			for(i=1;i<n+1;i++)
			{
				scanf("%d",&data);
				pHead[i].data = data;
				pHead[i].index = i;
				if(i == n)
					pHead[i].pNext = 0;
				else
					pHead[i].pNext = i+1;
				pHead[i].pSibling = 0;
			}

			int ti;
			for(i=1;i<n+1;i++)
			{
				scanf("%d",&ti);
				pHead[i].pSibling = ti;
			}
		}

		Node *pClone = (Node *)malloc((n+1)*sizeof(Node));
		if(pClone == NULL)
			exit(EXIT_FAILURE);
		CloneList(pHead,pClone,n+1);

		int i;
		for(i=1;i<n+1;i++)
		{
			printf("%d ",pClone[i].data);
			if(pClone[i].pSibling != 0)
				printf("%d\n",pClone[pClone[i].pSibling].data);
			else
				printf("%d\n",pClone[i].pSibling);
		}

		free(pHead);
		pHead = NULL;
		free(pClone);
		pClone = NULL;
	}
	return 0;
}

/**************************************************************

    Problem: 1524

    User: mmc_maodun

    Language: C

    Result: Accepted

    Time:40 ms

    Memory:912 kb

****************************************************************/

【剑指offer】复杂链表的复制,布布扣,bubuko.com

时间: 2024-07-30 10:09:17

【剑指offer】复杂链表的复制的相关文章

剑指offer 复杂链表的复制

题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路:要进行深拷贝,需要每次都new一个节点出来,利用unordered_map, 2.3 138. Copy List with Random Pointer https://leetcode.com/problems/copy-list-with-random-poi

剑指offer之链表

//剑指offer 之 链表 //面试题6 从尾到头打印链表 /***************************************************************************************** 问题描述: 输入一个链表的头节点,从尾到头反过来打印出每个节点的值 链表节点定义如下: struct ListNode{ int m_nValue; ListNode* m_pNext; }; *******************************

【剑指offer】链表倒数第k个节点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在九度OJ上测试,AC. 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的

剑指offer (5) 链表插入删除

我们在操作链表的时候,必须注意以下事项: 1. 链表指针为NULL的情况 2. 插入删除涉及到 链表第一个节点时,需要修改 链表的第一个节点: a. 因为 c语言都是传值的,如果需要修改一个变量,就必须通过 指向该变量的指针(即该变量的地址) 例如:例如 修改 int a,则输入参数必须是 int* a, 修改a 则是: *a = b; (b为int) 我们需要修改一个指针时,就必须通过 该指针的地址,也就是 指向该指针的指针,即二级指针 例如  修改 int* a, 则输入参数必须是 int*

剑指Offer--026-复杂链表的复制

链接 牛客OJ:复杂链表的复制 九度OJ:http://ac.jobdu.com/problem.php?pid=1524 GitHub代码: 026-复杂链表的复制 CSDN题解:剑指Offer–026-复杂链表的复制 牛客OJ 九度OJ CSDN题解 GitHub代码 复杂链表的复制 1524-复杂链表的复制 剑指Offer–026-复杂链表的复制 026-复杂链表的复制 题意 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)

【Java】 剑指offer(22) 链表中倒数第k个结点

正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始它们的值依次是1.2.3.4.5.6.这个链表的倒数第3个结点是值为4的结点. 思路 第一直觉是先从头开始遍历,计算链表个数n,然后重新遍历,第n-k+1个结点即为所需要的结点.但是需要遍历2次.后面采用了栈进行实现该

两个链表的第一个公共结点(剑指offer)+链表

两个链表的第一个公共结点 参与人数:1171时间限制:1秒空间限制:32768K 通过比例:31.25% 最佳记录:0 ms|0K(来自  running) 题目描述 输入两个链表,找出它们的第一个公共结点. 链接:http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

剑指Offer24 复杂链表的复制

1 /************************************************************************* 2 > File Name: 24_ComplexListClone.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月31日 星期三 14时24分35秒 6 ********************************

25、剑指offer--复杂链表的复制

题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路:直接把复制的node放在原node的后面,这样结构变为: 上面为第一次遍历,第二次遍历时把红色的新node的random域赋值,规则是: newNode->ranodm = oldNode->random->next; 然后第三次遍历把上面的链表拆分为两个即可

剑指Offer 14. 链表中倒数第k个结点 (链表)

题目描述 输入一个链表,输出该链表中倒数第k个结点. 题目地址 https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 思路 三个特例:如果输入的链表为空:k大于链表的长度:k为0的情况.对于正常情况,设置两个指针分