复杂链表的复制。一个链表的每个节点,有一个指向next指针向下一个节点,还有一个random指针指向这个链表中一个随机节点或者NULL,现在要求复制这个链表,返回复制后的新链表

复杂链表的复制。一个链表的每个节点,有一个指向next指针向下一个节点,还有一个random指针指向这个链表中一个随机节点或者NULL,现在要求复制这个链表,返回复制后的新链表
  • 这个题目不仅仅是简单的复制一个链表,它的难点在于一个节点里面除了data和next指针还多了一个random指针,无法复制
  • 如下图:蓝色虚线则表示random指针
    在这里插入图片描述
  • 首先,如下代码定义复杂链表
struct ComplexNode{
    int data;
    struct ComplexNode *next;
    struct ComplexNode*random;
};
  • 初始化图中链表如下
ComplexNode * CreateNode(int data)
{
    ComplexNode *node = (ComplexNode *)malloc(sizeof(ComplexNode ));
    node->data = data;
    node->random = node->next = NULL;
    return node;
}



ComplexNode *ComplexNodeInit()
{
    ComplexNode *n1 = CreateNode(1);
    ComplexNode *n2 = CreateNode(2);
    ComplexNode *n3 = CreateNode(3);
    ComplexNode *n4 = CreateNode(4);
    n1->next = n2;
    n2->next = n3;
    n3->next = n4;
    n1->random = n3;
    n2->random = n1;
    n3->random = n3;
    return n1;
}
  • 我们可以创建一个新的链表
    1.让新创建的链表节点跟在原有链表节点的后面
    2.复制random
    3.把一个链表拆分为两个链表
    如图为链表复制后
    在这里插入图片描述
  • 复制链表代码如下:
 //复制链表每个节点,让新的节点跟在之前链表的节点后面
    ComplexNode  *cur = list;
    ComplexNode *newNode;
    //cur只遍历之前链表的节点
    while (cur != NULL){
         newNode = CreateNode(cur->data);
         newNode->next = cur->next;
         cur->next = newNode;
         cur = newNode->next;
    }
  • 复制random字段
    在这里插入图片描述
//复制random 字段
    cur = list;
    while (cur != NULL){
         newNode = cur->next;
         if (cur->random != NULL){
             newNode->random = cur->random->next;
         }
         else{
             newNode->random = NULL;
         }
         cur = cur->next->next;
    }
  • 拆分链表

在这里插入图片描述

//拆开
    cur = list;
    ComplexNode *next, *newNext;
    ComplexNode *result = list->next;
    while (cur != NULL){
         newNode = cur->next;
         next = newNode->next;
         if (next == NULL){
             newNext = NULL;
         }
         else{
             newNext = next->next;
         }
         cur->next = next;
         newNode->next = newNext;
         cur = next;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值