`
junfeng_feng
  • 浏览: 19897 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

链表含有随机rand指针的复制

 
阅读更多
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
class Node {
public:
    Node* next;
    Node* rand;
    int value;
};

Node* copy_list_with_rand_ptr(Node* list) {
    if(list == NULL) {
        return NULL;
    }

    /*
     * 参考:http://hi.baidu.com/gkqofoydngbjqtq/item/6345d6104b7a8d06e65c36a3
     * 1、复制链表中的每一个节点放到自己的next
     * 2、修改偶数位置的节点的rand为rand-->next
     * 3、将链表分离,奇数节点组成原链表,偶数为复制的结果
     * */

    //第一步
    Node* p = list;
    while( p ) {
        //复制节点
        Node* n = new Node();//内存不足没有考虑
        n->rand = p->rand;
        n->value = p->value;

        //插入链表
        n->next = p->next;
        p->next = n;
        p = n->next;
    }


    //第二步,修改rand指针
    p = list;
    while( p ) {
        p = p->next;
        p->rand = p->rand->next;
        p = p->next;
    }

    //第三步
    p = list;
    Node* result = list->next;
    Node* t = result;
    while( p ) {
        p->next = t->next;
        p = p->next;
        if( p ) {
            t->next = p->next;
            t = t->next;
        } else {
            t->next = NULL;
        }
    }
    
    return result;
}

void print_list(Node* list) {
    printf("\n");
    if( list == NULL) {
        return;
    }

    while( list ) {
        printf("next=%x, rand=%x, value=%d\n", int(list->next), int(list->rand), list->value);
        list = list->next;
    }
    printf("\n");
}

int main()
{

    const int N = 10;
    Node ns[N];
    for(int i = 0; i < N; i++) {
        if(i < N-1) {
            ns[i].next = &ns[i+1];
        } else {
            ns[i].next = NULL;
        }

        ns[i].rand = &ns[rand() % N];
        ns[i].value = i;
    }
    print_list(ns);

    Node* copied = copy_list_with_rand_ptr(ns);
    
    print_list(copied);
    return 0;
}


分享到:
评论

相关推荐

    链表实现100万数的奇偶大小排列

    在这个题目中,“链表实现100万数的奇偶大小排列”是一个关于利用链表对随机生成的100万个数字进行特定排序的任务。下面我们将详细探讨这个话题。 首先,我们需要理解链表的基本概念。链表不同于数组,它不是一块...

    C语言链表操作演示程序

    6. **随机数据生成**:为了增加实际性和趣味性,程序会随机生成数据填充链表。这涉及到C语言中的随机数生成函数,如`srand()`和`rand()`。 这个项目对计算机科学的学生来说,是一个很好的实践机会,尤其是对于那些...

    链表圆桌置乱

    链表的头节点通常用来初始化链表,其指针域指向第一个实际数据节点。由于链表不需要连续的内存空间,因此它们对于内存管理更为灵活。 在VS2008中,我们可以使用C++来定义链表节点和链表类。例如,创建一个表示节点...

    线性链表的实现

    线性链表是一种常见的线性表存储结构,它通过一系列的节点来表示数据之间的逻辑关系,每个节点包含两个部分:一部分存放节点所代表的信息(即数据域),另一部分存放指向下一个节点的指针(即指针域)。本文档详细...

    c语言 整数链表排序

    ### C语言整数链表排序知识点解析 #### 题目背景与要求 题目要求我们使用C语言实现一种特殊的整数链表排序方法。...为了更好地理解整数链表排序的概念,可以进一步探索如何利用指针操作来实现真正的链表排序。

    C语言链表实现贪吃蛇小游戏

    13. **随机数生成**: 生成食物的位置通常需要随机性,可以使用C++的`&lt;cstdlib&gt;`库中的`rand()`函数和`srand()`函数来实现。 以上知识点构成了“C语言链表实现贪吃蛇小游戏”的核心,通过理解和掌握这些概念,开发者...

    C语言链表实现的贪吃蛇小游戏.zip

    8. **随机数生成**:使用`srand()`和`rand()`函数在地图上随机生成食物位置。确保食物不会生成在蛇身上。 9. **碰撞检测**:检查蛇头的位置是否与地图边界、自身或其他障碍物相冲突。如果发生碰撞,游戏结束。 10....

    随机产生密码的约瑟夫环

    链表首节点(`head`)被初始化后,通过循环创建新节点并填充随机生成的密码,最终形成一个循环链表,即最后一个节点指向第一个节点。 #### 程序流程解析 1. **输入人数**:首先程序会提示用户输入参与者的总数`n`...

    用链表实现猴子选王(C++)

    链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在猴子选王问题中,链表的每个节点代表一只猴子,通过特定的规则淘汰猴子,直到只剩下一个为王。 首先,我们需要定义一个链表...

    MFC链表实现贪吃蛇

    MFC中没有内置链表类,但我们可以自定义一个链表类,包含节点(包含位置信息)和指向下一个节点的指针。当蛇移动或吃食物时,链表会根据需要添加或删除节点。 3. **定时器实现蛇身的移动**:为了实现蛇的自动移动,...

    简单贪吃蛇代码(链表)

    4. **随机食物生成**:为了使游戏更具挑战性和趣味性,食物会在屏幕的随机位置出现。在C++中,可以使用`&lt;cstdlib&gt;`库中的`rand()`函数生成随机数,配合`srand()`设置随机数种子,确保每次游戏的起始状态不同。 5. *...

    C++控制台循环链表实现贪吃蛇

    这里使用`srand()`和`rand()`函数生成随机坐标,但必须确保生成的食物位置不与蛇的身体重叠。这通常通过检查新生成的食物坐标是否与蛇的任何节点坐标相同来实现,如果重叠,则重新生成坐标。 判断蛇是否吃到食物,...

    C语言实现2048

    《C语言实现2048游戏的编程之旅》 2048是一款广受欢迎的数字合并游戏,它的设计简洁而富有挑战性。...同时,这也是一个很好的实践平台,可以进一步探索C语言的高级特性,如指针和结构体,以及如何利用它们优化代码。

    C语言链表实现贪吃蛇游戏

    这里使用了`srand`和`rand`函数来确保每次生成的食物位置是随机的。 - `snakeMove` 函数根据用户输入的方向改变蛇的位置,同时处理碰撞检测。 - `cantCrossWall` 函数确保蛇不能穿过游戏边界。 - `runGame` 和 `...

    页面置换算法最佳,FIFO,LRU,随机,简单CLOCK,改进CLOCK.zip

    本程序涵盖了五种常见的页面置换算法:最佳置换算法(OPT)、先进先出算法(FIFO)、最近最久未使用算法(LRU)、随机置换算法(RAND)以及两种时钟算法(简单时钟和改进时钟)。下面将对这些算法进行详细介绍,并...

    数据结构之超市密码箱系统

    通过阅读和理解这些代码,初学者可以更好地掌握线性链表的使用和随机函数的应用,并通过实际操作加深对数据结构的理解。 总的来说,"数据结构之超市密码箱系统"是一个极好的学习资源,它将理论知识与实际应用相结合...

    MKing.rar_猴子选大王

    C++的库提供了rand()函数来生成随机数,而srand()可以设置随机数种子,以确保每次运行结果的随机性。我们可以设计一个函数,传入链表的头节点和剩余猴子的数量,返回最后剩下的猴子: ```cpp Node* electMonkeyKing...

    随机数文件生成读取代码.zip

    C语言中没有内置的随机数生成函数,但我们可以利用库函数如`&lt;stdlib.h&gt;`中的`rand()`来生成伪随机数。`rand()`函数会返回一个介于0到`RAND_MAX`之间的整数。为了得到指定范围内的随机数,通常我们需要对结果进行适当...

Global site tag (gtag.js) - Google Analytics