• 【剑指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
    ****************************************************************/

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    vue 兼容ie 下载文件
    IDEA maven项目添加自己的jar包依赖
    mongodb 用户权限操作
    springboot + aspect
    Enum枚举类
    线上CPU飙升100%问题排查
    Linux零拷贝技术
    Java线程池实现原理及其在美团业务中的实践
    深入解析String#intern
    Java对象内存布局
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4650489.html
Copyright © 2020-2023  润新知