1.复杂链表的复制
思路:第一步,复制原始链表的任意节点,并将复制节点链接到原节点后面;第二步,如果原始链表上的节点N的指针指向s,那对应复制节点N’指向s的复制节点s’;第三步,将长链表按奇数和偶数位置,分成两个链表。
/* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; */ class Solution { public: RandomListNode* Clone(RandomListNode* pHead) { /* *解题思路: *1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面; *2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next; *3、拆分链表,将链表拆分为原链表和复制后的链表 */ //复制 if(!pHead) return NULL; RandomListNode *cur=pHead; while(cur!=NULL) { RandomListNode *p=new RandomListNode(cur->label); p->next=cur->next; cur->next=p; cur=p->next; } //重新遍历 cur=pHead; RandomListNode *p; while(cur!=NULL) { p=cur->next; if(cur->random!=NULL) { p->random=cur->random->next; } cur=p->next; } //拆分 RandomListNode *clone=pHead->next; RandomListNode *tmp; cur=pHead; while(cur->next!=NULL) { tmp=cur->next; cur->next=tmp->next; cur=tmp; } return clone; } };