实现复杂链表的复制。
因为复杂链表中每个节点都有一个指向任意节点的指针。所以在确定这个链表的复制的时候。我们需要进行空间来换取时间上的效率。然后我们可以将链表复制项结合在拆分。
思路就这样。
我直接给出代码:
#pragmaonce #include<stdio.h> #include<malloc.h> #include<assert.h> typedefintDataType; typedefstructComplexNode { DataType _data; //数据 structComplexNode*_next; //指向下一个节点的指针 structComplexNode*_random; //指向随机节点 }ComplexNode; voidcreatComplexNode(ComplexNode*&pHead,DataTypex); ComplexNode*CopyComplexNode(ComplexNode*pHead); //创建复杂链表。 voidcreatComplexNode(ComplexNode*&pHead,DataTypex) { ComplexNode*ret,*endNode; if(pHead==NULL) { pHead=(ComplexNode*)malloc(sizeof(ComplexNode)); pHead->_random=NULL; pHead->_data=x; pHead->_next=NULL; return; } endNode=pHead; ret=endNode; while(endNode->_next) { ret=endNode; endNode=endNode->_next; } endNode->_next=(ComplexNode*)malloc(sizeof(ComplexNode)); endNode=endNode->_next; endNode->_next=NULL; endNode->_data=x; endNode->_random=ret; } //解决复杂链表的复制。可以把其中的操作分为3个步骤: //合并。 //复制随机指针值。 //拆分。 ComplexNode*CopyComplexNode(ComplexNode*pHead) { ComplexNode*copyNode; ComplexNode*pNode=pHead; ComplexNode*newLink=NULL; ComplexNode*newNode=NULL; assert(pHead); while(pNode!=NULL) { copyNode=(ComplexNode*)malloc(sizeof(ComplexNode)); copyNode->_data=pNode->_data; copyNode->_next=pNode->_next; copyNode->_random=NULL; pNode->_next=copyNode; pNode=copyNode->_next; } pNode=pHead; while(pNode!=NULL) { copyNode=pNode->_next; if(pNode->_random!=NULL) { copyNode->_random=pNode->_random->_next; } pNode=copyNode->_next; } pNode=pHead; newLink=pNode->_next; while(pNode!=NULL) { newNode=pNode->_next; pNode->_next=newNode->_next; pNode=pNode->_next; if(newNode->_next!=NULL) newNode->_next=pNode->_next; } returnnewLink; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。