题目描述
请实现一个函数可以复制一个复杂链表。
在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。
解题思路
-
普通思路
-
描述
按照普通情况复制节点,同时使用一个hash表将原节点与复制节点相关联。最后遍历一遍调整random指针即可。
-
实现代码:
/* struct ListNode { int val; ListNode *next, *random; ListNode(int x) : val(x), next(NULL), random(NULL) {} }; */ map<ListNode*,ListNode*> hash; // 在acwing网站给定,链表没有头结点,head即指向第一个元素 ListNode *copyRandomList(ListNode *head) { ListNode* newhead = new ListNode(-1); // 创建头结点,方便下面处理问题 ListNode* p = head,*q = newhead; // p指向猿链表,q指向新链表 ListNode* tmp; while(p) { tmp = new ListNode(p->val); // 复制节点 tmp->next = q->next; // 将其加入新链表 q->next = tmp; q = q->next; hash[p] = q; // 添加hash对 p = p->next; } p = head; q = newhead->next; while(p) { if(p->random) // 如果存在random { q->random = hash[p->random]; // 指定 } p = p->next; q = q->next; } return newhead->next; }
-