【问题标题】:Randomly shuffling a linked list随机打乱一个链表
【发布时间】:2014-04-15 20:38:23
【问题描述】:

我目前正在做一个项目,我必须编写的最后一个功能是使用 rand 函数对链表进行洗牌。

我很困惑它是如何工作的。

有人可以澄清一下我该如何实现这个吗?

我查看了我过去的代码示例以及我对数组进行的洗牌操作,但数组和链表完全不同。

编辑: 为了进一步澄清,我的教授让我们使用链表来洗牌,因为他就像那样“很棒”。

【问题讨论】:

  • 你有义务做链表吗?为什么不是矢量?或列表?在c++中链表没用
  • 如果你有一些代码可以打乱数组,只需来回转换列表
  • 我的教授不允许我们使用数组来洗牌。我们仅限于链接列表。
  • 我可以帮助你,但你确定你想要 c++ 方法吗?这很奇怪。在 C 中可以尝试解释它是如何工作的,在这种情况下,它非常有用。

标签: c++


【解决方案1】:

您始终可以添加另一个级别的间接... ;)
(参见维基百科中的Fundamental theorem of software engineering

只需创建一个指针数组,大小为列表的长度,从列表中取消链接项目并将它们的指针指向数组,然后打乱数组并重新构造列表。

编辑

如果您必须使用列表,您可以使用类似于合并排序的方法:

  • 将列表分成两半,
  • 递归地洗牌两个子列表,
  • 合并它们,从一个或另一个子列表中随机选择下一项。

【讨论】:

    【解决方案2】:

    我不知道它是否给出了合理的随机分布:D

    bool randcomp(int, int)
    {
        return (rand()%2) != 0;
    }
    
    
    mylist.sort(randcomp);
    

    【讨论】:

      【解决方案3】:

      您可以尝试多次迭代列表并以一定的概率交换相邻节点。像这样的:

      const float swapchance = 0.25;
      const int itercount = 100;
      
      struct node
      {
          int val;
          node *next;
      };
      
      node *fisrt;
      
      { // Creating example list
          node *ptr = 0;
          for (int i = 0; i < 20; i++)
          {
              node *tmp = new node;
              tmp.val = i;
              tmp.next = ptr;
              ptr = tmp;
          }
      }
      
      // Shuffling
      for (int i = 0; i < itercount; i++)
      {
          node *ptr = first;
          node *prev = 0;
          while (ptr && ptr->next)
          {
              if (std::rand() % 1000 / 1000.0 < swapchance)
              {
                  prev->next = ptr->next;
                  node *t = ptr->next->next;
                  ptr->next->next = ptr;
                  ptr->next = t;
              }
              prev = ptr;
              ptr = ptr->next;
          }
      }
      

      【讨论】:

        【解决方案4】:

        数组和链表的最大区别在于,当您使用数组时,您可以使用指针算法直接访问给定元素,这就是operator[] 的工作原理。

        但是,这并不妨碍您编写自己的 operator[] 或类似内容,您可以在列表中遍历并计算列表的第 n 个元素。到此为止,删除元素并将其放入新列表中就非常简单了。

        最大的区别在于复杂度是数组的 O(n),而链表的复杂度是 O(n^2)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多