《剑指Offer》面试题:复制复杂链表
来源:互联网 发布:非农数据和黄金价格 编辑:程序博客网 时间:2024/05/16 17:33
题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),然后进行复制。
思路
这里采用了数组的形式来保存链表节点,使得程序有很大的简化,从程序中可以看出,链表中节点中指向下一个节点的指针都没有排上用场。
使用数组来保存链表节点的代码如下
/*测试函数的要求输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为一个整数n (1<=n<=1000):n代表将要输入的链表元素的个数。(节点编号从1开始)。接下来有n个数,表示链表节点中的值。接下来有n个数Ti,Ti表示第i个节点的另一个指针指向。Ti = 0 表示这个指针为NULL。输出:对应每个测试案例,输出n行,每行有二个数,第一个代表当前节点值,第二个代表当前节点的特殊指针的值。样例输入:51 2 3 4 53 5 0 2 0样例输出:1 32 53 04 25 0 */#include<stdio.h>#include<stdlib.h>//链表节点typedef struct ListNode{ int mValue; int pNext; int pOther;}ListNode,*pListNode; void cloneComplicateList(pListNode pNode,pListNode pCloneNode,int n){ if(pNode==NULL||pCloneNode==NULL||n<=0){ return; } //开始复制 for(int i=0;i<n;i++){ pCloneNode[i].mValue=pNode[i].mValue; pCloneNode[i].pNext=pNode[i].pNext; pCloneNode[i].pOther=pNode[i].pOther; } }int main(void){ int n; while(scanf("%d",&n)!=EOF){ if(n>0){ pListNode pNode=(pListNode)malloc(n*sizeof(ListNode)); if(pNode==NULL){ exit(EXIT_FAILURE); } int val; //第一步:接收节点的value和下一个指针的指向 for(int i=0;i<n;i++){ scanf("%d",&val); pNode[i].mValue=val; //前一个节点指向后一个节点,只有最后一个节点指向空,即-1 if(i==n-1){ pNode[i].pNext=-1; } else{ pNode[i].pNext=i+1; } } //第二步:接收节点的特殊指针的指向 int index; for(int i=0;i<n;i++){ scanf("%d",&index); //这里需要注意的一点就是:在这里将标号进行了减 1操作,则特殊指针没有指向时 .pOther=-1. pNode[i].pOther=index-1;//需要减1,因为用数组来保存的链表节点,从0开始存储 } //第三步,复制链表 //先准备复制需要的空间 pListNode pCloneNode=(pListNode)malloc(n*sizeof(ListNode)); if(pCloneNode==NULL){ exit(EXIT_FAILURE); } cloneComplicateList(pNode,pCloneNode,n); //最后按要求输出复制后的链表 for(int i=0;i<n;i++){ // printf("%d %d",pCloneNode[i].mValue,pCloneNode[pCloneNode[i].pOther].mValue); //不能直接用上面语句输出,这样会导致特殊指针没有指向时,将会输出存储在数组下标为0处的结点的value值 printf("%d ",pCloneNode[i].mValue) ; if(pCloneNode[i].pOther!=-1){//没有指向时为 -1 ,上面程序中有解释 printf("%d\n",pCloneNode[pCloneNode[i].pOther].mValue); } else{ printf("%d\n",pCloneNode[i].pOther+1);//保证当特殊指针没有指向时输入为 0. //上面这条语句可以直接这样:printf("0\n"); } } free(pNode); pNode=NULL; free(pCloneNode); pCloneNode=NULL; } } return 0;}
上面采用了数组的形式来保存链表中的节点,因为数组时顺序存储的,因为数组中的下一个元素就是上一个元素的下一个节点,导致节点中的属性——pNext没有用。
但是,当不采用数组形式来存储链表中的节点时,将pNext这一个属性利用来即可。
0 0
- [剑指offer][面试题26]复杂链表的复制
- 剑指offer 面试题26复杂链表的复制
- 【剑指offer】面试题26:复杂链表的复制
- 剑指Offer:面试题26 复杂链表的复制
- 《剑指Offer》面试题26:复杂链表的复制
- 剑指offer面试题26-复杂链表的复制
- 《剑指Offer》面试题:复制复杂链表
- 剑指offer-面试题26:复杂链表的复制
- 剑指offer-面试题26.复杂链表的复制
- 剑指Offer----面试题26:复杂链表的复制
- 剑指offer 面试题26 复杂链表的复制
- 剑指offer面试题26:复杂链表的复制
- 剑指offer--面试题26:复杂链表的复制
- 剑指Offer---面试题26:复杂链表的复制
- 剑指offer-面试题26-复杂链表的复制
- 剑指offer-面试题26 复杂链表的复制
- 【面试题】剑指Offer-26-复杂链表的复制
- 剑指offer-面试题26-复杂链表的复制
- 理解 C# 的Lock
- Next数组的计算
- 界面的设计总结
- Linux内核工程导论——内核架构概览
- MySQL 性能优化
- 《剑指Offer》面试题:复制复杂链表
- 安装完操作系统之后,linux 启动失败,报错为"Invalid magic number 0 error 13: invalid or unsupported executable format"
- 测试基础知识
- iOS8之后利用storyboard、xib动态获取行高
- 选择下拉框某一项 链接到页面
- Lintcode: 颜色分类
- 淘宝穿衣搭配算法_赛制描述
- Android开发中versionCode和versionName解析
- 《机器学习实战》学习笔记:利用Adaboost元算法提高分类性能