问题:
请实现一个函数,复制一个复杂链表,在复杂链表中,每个节点除了有一个指向下一个节点的指针,还有一个指向该链表的任意节点的指针,或者该指针指向NULL。
eg:
复制该链表分为三步:
1.复制原始链表的任意节点,N并创建一个新的节点N’,在把节点连接到N的后面,
2.原始链表上的节点N的sibling指针指向S则,对应的复制节点的N’的silbing指针指向S的复制节点S’
执行完上面两步,原链表如图;
3.将原链表和复制的链表分离
代码实现:
/*
实现复杂链表的复制
*/
//定义复杂链表的节点
typedef struct node{
char data;
struct node *next;
struct node *slibing;
}ElemSN;
//创建复杂链表
ElemSN* createConfuseLink(char data[], int len){
ElemSN *pnew = NULL, *head = NULL, *tail = NULL;
for (int i = 0; i < len; i++){
pnew = (ElemSN*)malloc(sizeof(ElemSN));
pnew->data = data[i];
pnew->next = pnew->slibing = NULL;
if (!head){
head = pnew;
tail = pnew;
}
else{
tail->next = pnew;
tail = tail->next;
}
}
//复杂链表构建
head->slibing = head->next->next;
head->next->next->next->slibing = head->next;
head->next->slibing = head->next->next->next->next;
return head;
}
void printLink(ElemSN *head){
for (ElemSN *p = head; p; p = p->next){
printf("%c ", p->data);
if (p->slibing){
printf("silbing=%c\n", p->slibing->data);
}
else{
printf("silbing=NULL\n");
}
}
}
复杂链表的复制
void cloneNodes(ElemSN *head){
ElemSN *p = head;
while (p){
ElemSN *pc = (ElemSN*)malloc(sizeof(ElemSN));
pc->data = p->data;
pc->next = p->next;
pc->slibing = NULL;
p->next = pc;
p = pc->next;
}
}
void connectSlibingNodes(ElemSN *head){
ElemSN *p = head;
while (p){
ElemSN *pc = p->next;
if (p->slibing){
pc->slibing = p->slibing->next;
}
p = pc->next;
}
}
ElemSN* reconnectNode(ElemSN *head){
cloneNodes(head);
connectSlibingNodes(head);
ElemSN *p = head;
ElemSN *pch = NULL;
ElemSN *pc = NULL;
if (p){
pch = pc = p->next;
p->next = pch->next;
p = p->next;
}
while (p){
pc->next = p->next;
pc = pc->next;
p = pc->next;
}
return pch;
}
测试:
int main(void){
char data[6] = "ABCDE";
ElemSN *h = createConfuseLink(data, 5);
printLink(h);
printf("\n\n");
printLink(reconnectNode(h));
system("pause");
return 0;
}
调试结果