目录
一、思路分析
二、如何操作
三、源码
深拷贝:原封不动的拷贝一份
一、思路分析:
这一题,偏向于技巧性。如果是按照工科思维硬推,那会非常头大,脑袋瓜疼。
这一题目的核心难点在于:处理random指针
思路的核心是:创建每一个节点的拷贝,链接在该节点的后面。
那么,每一个节点的random指针就是它前一个节点的random
例如:
7的random就是前一个节点7的random
13的random就是前一个节点13的random
...
看图:
二、如何操作
1、复制节点在原链表的后面
2、从复制节点的前一个节点找到其random
3、处理完后对复制的节点进行链接,直接取下来尾插
(注意画图,带上变量进行推演)
三、源码
struct Node* copyRandomList(struct Node* head) {struct Node *cur = head;//拷贝while(cur){struct Node* copy = (struct Node*) malloc(sizeof( struct Node));copy->val = cur->val;copy->next = cur->next;cur->next = copy;cur = copy->next;}//处理randomcur = head; while(cur){struct Node *copy = cur->next;if(cur->random == NULL){copy->random = NULL;}else{copy->random = cur->random->next;}cur = copy->next;}//处理新链表cur = head;struct Node *newhead = NULL;struct Node *tail = NULL;while(cur){struct Node *copy = cur->next;struct Node *next = copy->next;if(tail == NULL){newhead = tail = copy;}else{tail->next= copy;tail = tail->next;}cur->next = next;cur = next;}return newhead;
}