题目:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
思路:
复制自身到下一个结点;
设置新结点的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 || pHead->next==NULL) return pHead; 当有一个结点的时候,不能直接返回啊,要复制~~ if(pHead==NULL) return NULL; copy(pHead); setNewNodeRandom(pHead); RandomListNode *res=splice(pHead); return res; }private: void copy(RandomListNode *pHead) { while(pHead!=NULL) { RandomListNode *newnode=new RandomListNode(pHead->label); newnode->next=pHead->next; //newnode->random=pHead->random; 新结点的random指针应先不设置 RandomListNode *nextp=pHead->next;//原来的next结点 pHead->next=newnode;//指向新结点 pHead=nextp; } } void setNewNodeRandom(RandomListNode *pHead) { while(pHead!=NULL) { RandomListNode *nextp=pHead->next; nextp->random=pHead->random; pHead=nextp->next; } } RandomListNode* splice(RandomListNode *pHead) { RandomListNode *newHead=pHead->next; RandomListNode *head=newHead; while(newHead->next!=NULL) { pHead->next=newHead->next; pHead=newHead->next; newHead->next=pHead->next; newHead=pHead->next; } pHead->next=NULL; return head; }};