题解 | #复杂链表的复制#
复杂链表的复制
http://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba
# 第七题 /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; */ class Solution { public: RandomListNode* Clone(RandomListNode* pHead) { // 边界问题 if(pHead==NULL) return NULL; // 题目都看不懂TAT // 好像意思是 给他这个一模一样复制出来 // 12345啥的next就是正常的指针链接到最后 // 35#2# 是前面12345里面的random的指针 // random的指针指向指定的值 3 就代表random指向第三个,#代表random指向空 // 用来返回的答案 RandomListNode* ans=new RandomListNode(0); // ans会动 ret_ans保存ans的头 RandomListNode* ret_ans=new RandomListNode(0); ret_ans->next=ans; // 保存 RandomListNode* head=pHead; // 后面一直要用到,防止创建的时候复杂度大 先声明了到时候直接用 RandomListNode* temp=ans; // 先遍历一遍,把12345整个链表的next保存下来 while(pHead!=NULL){ // 调试的时候输出的 看他这里面到底是个啥 // cout<<pHead->label<<" "<<pHead->random<<endl; ans->label=pHead->label; pHead=pHead->next; // 如果pHead 后面没了 就不创建新节点了 if(pHead!=NULL){ // 新建的链表每个结点12345每次都是要new出来 // 不然直接 ans=ans->next 会访问空指针报错 ans->next=new RandomListNode(NULL); ans=ans->next; } } // 让ans、pHead回到开头 ans=ret_ans->next; pHead=head; // 决定了每次要走几步 就是random的值是几 比如说 是3,就说明后面要重新走到三的位置 int go_temp; // 从现在开始 处理pHead里面random的内容 while(pHead!=NULL) { // 如果是# random直接指向空 然后 各自往后走一个 if(pHead->random == NULL) { ans->random=NULL; ans=ans->next; pHead=pHead->next; continue; } // temp是用来重头找random的点的 // 比如说go_temp是3,就代表往后指向第三个,从temp开始走的 temp=ret_ans->next; go_temp = pHead->random->label; // go_temp是1,就代表指向第一个,链表不用向后走 // go_temp是2,就代表指向第二个,链表向后走一次就可 while(go_temp !=1 ){ temp=temp->next; go_temp--; } // ans 指向了random需要的 ans->random=temp; // ans 和pHead各自往后走一个向后循环做下去。。。。。 ans=ans->next; pHead=pHead->next; } return ret_ans->next; } }; |
题解 文章被收录于专栏
一遍做剑指offer 一边保存做题步骤 并附带详细注释哦