时间限制:1秒 空间限制:32768K 热度指数:485980
本题知识点: 链表
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
题目链接:题目链接
这题意,搞了半天没看懂,一度以为要自己写个random,然后copy下来random链向的节点,组成新链...
去讨论区一看,才发现自己和题意差天远。
就是让你复制一个链表,只是这个链表多了一项random而已...天啦撸!!!
/*
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 == NULL) return NULL;
RandomListNode *curnode = pHead;
//在旧表中创建新链表节点
while(curnode != NULL){
RandomListNode *copynode = new RandomListNode(curnode->label);
copynode->next = curnode->next;
curnode->next = copynode;
curnode = copynode->next;
}
curnode = pHead;
//初始化新链表的兄弟节点
while(curnode != NULL){
RandomListNode *tempnode = curnode->next;
if(curnode->random){
tempnode->random = curnode->random->next;
}
curnode = tempnode->next;
}
curnode = pHead;
RandomListNode *clonenode = pHead->next;
RandomListNode *tempnode = NULL;
//从旧链拆分得到新链
while(curnode->next != NULL){
tempnode = curnode->next;
curnode->next = tempnode->next;
curnode = tempnode;
}
return clonenode;
}
};