【剑指offer系列】 复杂链表的复制___26

来源:互联网 发布:重庆seo服务 编辑:程序博客网 时间:2024/05/19 13:08

  题目描述:
  请实现一个函数,实现复杂链表的复制。
  在复杂链表中,每个节点除了有一个next指针指向下一个节点之外,还有一个sibling指针指向链表中的任意节点或者NULL
  
  示例:
  一个复杂链表的示例如下:
  这里写图片描述
      
  分析:
  1)复制链表中的每一个节点,并用next指针链接
  2)为每一个复制后的节点的sibling指针赋值,如A’->sibling = A->sibling->next
  3)将链表按照奇偶顺序拆分链表
  这里写图片描述
  这里写图片描述
  这里写图片描述
     
  代码:    

typedef struct listNode{    int val;    struct listNode *next;    struct listNode *sibling;    listNode(int num):val(num),next(NULL),sibling(NULL){}}listNode; void cloneNodes(listNode *head){    //step 1    listNode *p=head;    while(p){        listNode *dup=new listNode(p->val);        dup->next=p->next;        p->next=dup;        p=dup->next;    }}void connectSibling(listNode *head){    //step 2    listNode *p=head;    while(p){        if(p->sibling){            p->next->sibling=p->sibling->next;        }        p=p->next->next;    }}listNode *disconnectNodes(listNode *head){    //step 3    listNode *dupHead=head->next;    listNode *p=head;    listNode *q=dupHead;    while(p){        p->next=q->next;        p=p->next;        q->next=p->next;        q=q->next;    }    return dupHead;}listNode *duplicateList(listNode *head){    if(head==NULL)  return NULL;    cloneNodes(head);    connectSibling(head);    return disconnectNodes(head);}
0 0
原创粉丝点击