剑指offer:复杂链表的复制

来源:互联网 发布:c语言播放音乐代码 编辑:程序博客网 时间:2024/04/30 05:58
题目描述:输入一个复杂链表,每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点(可能为NULL),求输出复杂链表的拷贝(返回拷贝链表的头结点即可)

思路:一般复制一个简单链表就这么遍历一遍就好了,这个复杂链表,比简单链表多的地方就在于多了一个random的指针,也就是说在建立完简单链表之后,如何在新的链表中找到random对应的地址。我们已知的是旧的节点的地址,所以只需要用一个map,保存每一个节点旧的节点对应的新的节点的地址即可。

第一次遍历,建立简单节点,第二次遍历,对于旧链表中的每一个节点的random指针地址,从map中找到新链表中对应节点的地址,连接上就好了。

#include<iostream>#include<map>using namespace std;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)return NULL;RandomListNode * res = new RandomListNode(pHead->label);RandomListNode * tmp = res;RandomListNode * p = pHead;map<RandomListNode *, RandomListNode *> m;m[p] = res;//tmp = tmp->next;p = p->next;while (p){//tmp = new RandomListNode(p->label);//m[p] = tmp;//tmp = tmp->next;//p = p->next;RandomListNode * newNode = new RandomListNode(p->label);tmp->next = newNode;tmp = newNode;m[p] = tmp;p = p->next;}p = pHead;tmp = res;while (p){if (p->random)tmp->random = m.find(p->random)->second;tmp = tmp->next;p = p->next;}return res;}};void deleteList(RandomListNode * pHead){while (pHead != NULL){RandomListNode * p = pHead->next;delete pHead;pHead = p;}}int main(){RandomListNode * p1 = new RandomListNode(1);RandomListNode * p2 = new RandomListNode(2);RandomListNode * p3 = new RandomListNode(3);RandomListNode * p4 = new RandomListNode(4);RandomListNode * p5 = new RandomListNode(5);p1->next = p2; p2->next = p3;p3->next = p4; p4->next = p5;p5->next = NULL;p1->random = p3; p2->random = p4;p3->random = NULL; p4->random = p2;p5->random = NULL;Solution s;RandomListNode * newHead = s.Clone(p1);deleteList(newHead);deleteList(p1);return 0;}

0 0
原创粉丝点击