链表部分的最后一道题啦。祝大家新年快乐~祝我心想事成_
这道题抄的。就没看懂想干啥···大概就是先拷贝一份,咋拷贝呢,就是在每个点之后产生一个相同的点,然后给它的random部分赋值,然后将其拆分出来。
听起来还蛮简单的,不过我当时是没写出来···
不过还是抄了一份:
RandomListNode *copyRandomList(RandomListNode *head) {
RandomListNode newHead, l1, l2;
l1 = head;
// 节点后产生新节点
while(l1) {
// 这一部分是经典的链表插入节点,new一个,新的后位指向旧的后位,
// 旧的后位指向新节点,最后旧节点指向新的后位
l2 = new RandomListNode(l1->val);
l2->next = l1->next;
l1->next = l2;
l1 = l2->next; //这一步也可以写为 l1=l1->next->next;
}
newHead = head; //用一个新指针指向已经扩展后的链表
// 给新节点的random部分赋值
for(l1 = head; l1; l1 = l1->next->next) {
if(l1->random)
l1->next->random = l1->random->next;
}
// 拆分
for(l1 = head; l1; l1 = l1->next) {
l2 = l1->next;
l1->next = l2->next;
if(l2->next)
l2->next = l2->next->next;
}
return newHead;
}
网友评论