给定一个链表, 每个节点包含一个额外增加的随机指针random, 该指针可以指向链表中的任何节点或空节点, 要求返回这个链表的深拷贝。
typedef struct ListNode
{
int val;
struct ListNode*next;
struct ListNode*random;
} ListNode;
我们要返回一个原来链表的深度拷贝,那么我们就要拷贝它的next ,和random,我们的思路是,在每一个老节点的后面增加一个新节点,这个节点的信息和老节点的信息一样,最后拷贝成功后再新老链表分开,如下图 :
思路就是这样,我们来看看具体实现,我在这里用的是C语言.
ListNode* copyRandomList(ListNode* head) {
if (head = NULL)
{
return NULL;
}
//复制新节点
ListNode *cur = head;
while (cur != NULL)
{
//申请一个节点,进行初始化
ListNode *newnode = (ListNode *)malloc(sizeof(ListNode));
newnode->val = cur->val;
newnode->random = NULL;
//将新节点与老节点进行连接
newnode->next = cur->next;
cur->next = newnode;
//老节点往后移动,继续拷贝下一个
cur = newnode->next;
}
//复制random
cur = head;
while (cur != NULL)
{
if (cur->random != NULL)
{
//最重要的一步,复制random
cur->next->random = cur->random->next;
}
cur = cur->next->next;
}
//拆开
cur = head;
//定义一个新头节点,一会就返回这个节点
ListNode *newhead = head->next;
while (cur != NULL)
{
ListNode *newnode = cur->next;
cur->next = newnode->next;
if (newnode->next != NULL)
{
newnode->next = newnode->next->next;
}
cur = cur->next;
}
//返回新链表的头节点
return newhead;
}
这道题难想的还是在于random信息的复制, 整体代码实现并不算很难.
感谢观看,有什么问题可以指出,谢谢!