【发布时间】:2019-11-26 22:30:57
【问题描述】:
我正在尝试在链接列表中选择一个随机节点。我的想法是重新链接列表 n 次,以便每次 n 次时头部都会改变是一个不同的值。所以例如:列表包含他->需要->一些->牛奶。从牛奶开始,将其链接为另一个列表节点的头部,对于 n-times=2,头部将成为需要。如果 n-times=3,head 变成 he。作为一个函数,执行此操作的参数是一个列表和一个随机数。 我的想法写在下面:
typedef struct Stops
{
char name[51];
struct Stops *nxt;
}Stops;
Stops *relinking (Stops *alist_torelink, int rndtimes)
{
int linkcnt=0; //to count how many times it's been linked, i.e how many links//
Stops *leknd=NULL;
while( alist_torelink!=NULL && linkcnt < rndtimes )
{
leknd= (Stops*) malloc(sizeof(Stops));
strcpy(leknd->name, alist_torelink->name);
leknd->nxt=alist_torelink;
linkcnt++;
if(alist_torelink==NULL)
{alist_torelink=leknd;} //so if it reaches the end of the original list, it starts back at the head of the list being relinked and continues. this will mean the loop exits when linkcnt=rndtimes-1//
alist_torelink=alist_torelink->nxt;
} return leknd;
}
这足以有效地获得随机头部,但是我没有看到代码存在问题。与具有 5 个元素的原始列表一样,如果创建新列表为 停止 *newlist= relinking(original, 4),函数的行为,我不明白,我只能看到创建的 newlist 是
【问题讨论】:
-
@awdbutahdagreyt 您需要从原始列表中再创建一个列表,还是只需要重新链接原始列表中的新节点而不创建更多列表?
-
我无法修改原始节点,所以是的,我需要从原始节点创建新节点。
-
问题出在哪里?
-
有一种(甚至是相对有效的)方法可以在事先不知道列表长度的情况下从列表中选择一个随机节点,但是您当前对问题的陈述太模糊,无法判断它是否足以满足您的需求。
-
从列表中选择一个随机节点正是我想要做的。上面的一切都是我想这样做的方式。
标签: c singly-linked-list