如何在C中随机混洗链表

时间:2012-07-03 10:40:58

标签: c algorithm list data-structures

我有一个链接列表,我想实现一个功能:

Random_Shuffle_List (struct node **Headptr) - 输出一个列表,使每个节点从其原始位置随机移动。

请帮我一个有效的算法来实现这一目标。

4 个答案:

答案 0 :(得分:14)

我会推荐天真的方法:

  1. 构建指向每个节点的指针数组。
  2. 随机播放阵列。这比随机化链接结构更容易。
  3. 通过逐步执行数组顺序中的节点来“重新线程化”列表。
  4. 当然,这使用了相对微小的额外内存,但我认为它在实现(和理解)时间方面比在链接列表上直接工作的方法更有效。

答案 1 :(得分:0)

简单地反转链接列表并交换中间节点和结束节点。我认为这将工作。复杂性将是O(n)。

答案 2 :(得分:0)

一种方法是初始化一个额外的字段,该字段将包含由随机函数生成的随机数。

width:100%

答案 3 :(得分:-1)

  1. 计算链接列表中的节点数,例如n
  2. ab
  3. 之间生成两个随机整数(0n
  4. 交换两个节点ab
  5. 重复以上m次。
  6. 这不是一个好方法,但不需要额外的内存作为@ unwind的建议。

    @ unwind的解决方案是使用一个窗口,可以做一件事。

    1. 修正窗口长度w
    2. 在链接列表中选择两个随机节点,以便可以形成两个非重叠的3.长度w(窗口)的子列表
    3. 构建两个数组,每个数组用于指向列表中每个注释的一个窗口
    4. 随机播放每个窗口
    5. 两个窗口之间的随机指针
    6. 重新链接节点
    7. 执行上述窗口选择,改组和重新链接m次。