zoukankan      html  css  js  c++  java
  • 【剑指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了。这确实有点坑了,主要是例子给的太不好了。非常easy产生歧义。

        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
    ",pClone[pClone[i].pSibling].data);
    			else
    				printf("%d
    ",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
    ****************************************************************/

  • 相关阅读:
    PAT (Advanced Level) Practice 1100 Mars Numbers (20分)
    PAT (Advanced Level) Practice 1107 Social Clusters (30分) (并查集)
    PAT (Advanced Level) Practice 1105 Spiral Matrix (25分)
    PAT (Advanced Level) Practice 1104 Sum of Number Segments (20分)
    PAT (Advanced Level) Practice 1111 Online Map (30分) (两次迪杰斯特拉混合)
    PAT (Advanced Level) Practice 1110 Complete Binary Tree (25分) (完全二叉树的判断+分享致命婴幼儿错误)
    PAT (Advanced Level) Practice 1109 Group Photo (25分)
    PAT (Advanced Level) Practice 1108 Finding Average (20分)
    P6225 [eJOI2019]异或橙子 树状数组 异或 位运算
    P4124 [CQOI2016]手机号码 数位DP
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6784712.html
Copyright © 2011-2022 走看看