我有一个链接列表,我想实现一个功能:
Random_Shuffle_List (struct node **Headptr)
- 它输出一个列表,使得每个节点都从其原始位置随机移动。
请帮助我用一种有效的算法来实现这一点。
我有一个链接列表,我想实现一个功能:
Random_Shuffle_List (struct node **Headptr)
- 它输出一个列表,使得每个节点都从其原始位置随机移动。
请帮助我用一种有效的算法来实现这一点。
我会推荐天真的方法:
当然,这使用了相对少量的额外内存,但我认为与直接在链表上工作的方法相比,它在实现(和理解)时间以及可能还有运行时间方面更“有效”。
只需反转链表并交换中间节点和结束节点。我认为这会起作用。复杂度将是 O(n)。
n
a
, b
)0
n
a
和b
。m
几次。这不是一个好方法,但不像@unwind 的建议那样需要额外的内存。
使用@unwind 的解决方案可以做的一件事是使用窗口。
w
w
形成两个不重叠的3.长度(窗口)的子列表m
时间。一种方法是初始化一个额外的字段,该字段将包含由随机函数生成的随机数。
typedef struct node
{
int data;
int random;
struct node *next;
} card;
for eg, we can give
newnode->random = rand() % (100)
,which will give random numbers up to 100 to the field.Now Ordering the
linked list to ascending or descending according to the random number ,will
help us to shuffle the nodes .
for (tempnode = start; tempnode->next != NULL; tempnode = tempnode->next)
for (nextnode = tempnode->next; nextnode->next != NULL; nextnode =
nextnode->next)
{
if (tempnode->random > nextnode->random)
{
swap(tempnode, nextnode);
}
}