复杂单链表的复制
来源:互联网 发布:电商 双十一 实时数据 编辑:程序博客网 时间:2024/05/16 03:46
/******************* WZ ASUST 20161:先int实例 后模板化2: 复制不能改变原串的数据及结构3: 随机指针的正确性思考:除了追加新结点后分离新旧链表; 还有一复杂度高的算法,就是记录下每一个结点,随机指针指向的结点在整个链中的排序(队列实现)建立新链表后,根据队列记录,连接随机指针; 不能记录值,仅能实现一些特殊的,如无重复段的链;*******************/#include <map>#include<queue>#include"wz.h" struct ComplexNode{ int value; ComplexNode* pNext; ComplexNode* pSibling;}; struct myNode{ int value; int* ptr; myNode *next;}; ComplexNode* Clone(ComplexNode* pHead) { if(pHead == NULL) return NULL; map<ComplexNode*, ComplexNode*> pointMap; ComplexNode* newHead,*tail; newHead = new ComplexNode; newHead->value = pHead->value; newHead->pNext = NULL; newHead->pSibling = NULL; pointMap[pHead] = newHead; tail = newHead; ComplexNode *p = pHead->pNext; while(p != NULL) { ComplexNode* newNode = new ComplexNode; newNode->value = p->value; newNode->pNext = NULL; newNode->pSibling = NULL; tail->pNext = newNode; tail = newNode; pointMap[p] = newNode; p = p->pNext; } p = pHead; tail = newHead; while(p!=NULL) { if(p->pSibling!=NULL) { tail->pSibling = pointMap.find(p->pSibling)->second; } p = p->pNext; tail = tail->pNext; } return newHead; } void deleteList(ComplexNode* pHead) { while(pHead!=NULL) { ComplexNode* pNext = pHead->pNext; delete pHead; pHead = pNext; } }void print(ComplexNode* pHead){ ComplexNode* p=pHead; while(p) { cout<<p->value<<" "; p=p->pNext; }cout<<endl;}void print( myNode* pHead){ myNode* p=pHead; while(p) { cout<<p->value<<" "; p=p->next; }cout<<endl;} ComplexNode* myClone2(ComplexNode* pHead) { //int k=4; ComplexNode*p= new ComplexNode; ComplexNode*q= NULL; ComplexNode*newhead= NULL; if(pHead) { p=pHead; while(p->pNext) { ComplexNode*add= new ComplexNode; add->value=p->value; add->pSibling=NULL;add->pNext=p->pNext; p->pNext=add; p=p->pNext->pNext; } ComplexNode*add= new ComplexNode; add->value=p->value; add->pSibling=NULL;add->pNext=p->pNext; p->pNext=add; p=pHead; q=p->pNext; newhead=q; cout<<q->value<<endl; // bug rand pointor:pSibling //while(p->pNext) while(k--) { q->pSibling=p->pSibling->pNext; //p->pNext=q->pNext; // q->pNext=p->pNext; //p=p->pNext; // q=q->pNext; } //while(p->pNext) // { // q->pSibling=p->pSibling->pNext; // p->pNext=p->pNext->pNext; //q->pNext=q->pNext->pNext; // p=p->pNext->pNext; // q=q->pNext->pNext; // } /** made new link:q***/ // newhead=q; // while(q->pNext) //{ // q->pNext=q->pNext->pNext; // q=q->pNext; // } /*****new link out*****/ // p=pHead; q=newhead; while(q->pNext) { p->pNext=q->pNext;p=p->pNext; q->pNext=p->pNext;q=q->pNext; } // delete p->pNext; //can ont do this p->pNext=NULL; // must do this or add 4 to old link // new link out // p=pHead; }return newhead;}void t2(){ cout<<"t2()"<<endl; ComplexNode* p1 = new ComplexNode; ComplexNode* p2 = new ComplexNode; ComplexNode* p3 = new ComplexNode; ComplexNode* p4 = new ComplexNode; p1->pNext = p2; p2->pNext = p3; p3->pNext = p4; p4->pNext = NULL; p1->value = 1 ; p2->value = 2; p3->value = 3 ; p4->value = 4; p1->pSibling = p3;p2->pSibling = p4; p3->pSibling = NULL; p4->pSibling = NULL; print(p1); ComplexNode* newHead = myClone2(p1); cout<<"old link:"<<endl; print(p1); cout<<"new link:"<<endl; print(newHead); // cout<<(newHead->pSibling)->value<<endl; //3 deleteList(newHead); deleteList(p1); }int main(){t2();return 0;}// 随机处的bug 没处理
0 0
- 复杂单链表的复制
- 复杂单链表的复制
- 复杂单链表的复制
- 复杂单链表的复制
- 小结 | 复杂单链表的复制
- 【数据结构】单链表--复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- R语言批量处理TRMM降雨数据
- java110云计算(hadoop)免费培训视频教程
- 点灯游戏的模拟
- 11. Container With Most Water
- 手把手教你安装Hbase,一次成功!
- 复杂单链表的复制
- http详解之telnet
- Android 语音识别
- Android中利用Drawable实现图片循环
- Merge OUTPUT 高级用法综合写的一个MergeTab的存储过程
- SDM 环境配置
- redis-trib.rb: command not found
- [C/C++] 显示各种C/C++编译器的预定义宏(C11标准、C++11标准、VC、BCB、Intel、GCC)
- java程序性能优化学习笔记day1