今天终于过了CopyLinkListWithRandomPoint了,犹记得当年和fawks大神住一起的时候,大神还出了这道他当年MS面试的链表题目,
我当时愣是没写出时间复杂度O(n)空间复杂度O(1)的算法,这道题目确实很巧,先把Copy的链表和原来和在一起,利用原来的random的相对位置来Copy新的random,
我当时也想到了利用相对位置这一点,但是算法还是没成型。
后来还把代码发给某大神去看代码风格,但是没AC,今天写了很多Link代码,应该会有感觉,果然今天AC掉了,
问题在于原来的CreateLinklist出错了,而且random域的错用print很难发现错误,后来发现了这个隐藏的bug,因为后面的新节点还没new出来,
因此new新节点和copy random域要分成两个loop来做,因为copy random要利用原linklist的random 的相对位置和next域。
附上本吊的代码:
我当时愣是没写出时间复杂度O(n)空间复杂度O(1)的算法,这道题目确实很巧,先把Copy的链表和原来和在一起,利用原来的random的相对位置来Copy新的random,
我当时也想到了利用相对位置这一点,但是算法还是没成型。
其实之前思想已经清楚了,但是代码AC却又是很多细节要想对,感觉又是个20 80原理,哎。。。。
后来还把代码发给某大神去看代码风格,但是没AC,今天写了很多Link代码,应该会有感觉,果然今天AC掉了,
问题在于原来的CreateLinklist出错了,而且random域的错用print很难发现错误,后来发现了这个隐藏的bug,因为后面的新节点还没new出来,
因此new新节点和copy random域要分成两个loop来做,因为copy random要利用原linklist的random 的相对位置和next域。
附上本吊的代码:
RandomListNode *CopyRandomList(RandomListNode *head) {
if(head==NULL) return NULL;
RandomListNode* qHead, *p=head,*pNext;//qHead is another copyed list head, p is head moving point
while(p!=NULL)
{
pNext=p->next;
p->next=new RandomListNode();
p->next->label=p->label;
p->next->next=pNext;
p=pNext;//point move to original next
}
p=head;
while(p!=NULL)
{
if(p->random!=NULL)//process random is null, can not acces next point
p->next->random=p->random->next;
else
p->next->random=NULL;
p=p->next->next;
}
qHead=head->next;
p=head;
while(1)
{
pNext=p->next;
p->next=p->next->next;
if(p->next==NULL)//p is original list's last node, process last node case specifically
break;
pNext->next=p->next->next;
p=p->next;//point move to original next
}
pNext->next=NULL;
return qHead;
}
我的目标就是将水平提高到和fawks大神一样程度,熟悉DS,熟悉C++,熟悉Alg