随机合并两个链表
Randomly merging two linked lists
我首先要说的是,我已经寻找并尝试了几种不同的解决方案,但没有成功。我做这件事已经太久了,所以任何帮助都将不胜感激。
任务是打乱代表一副牌的链表。我得到了所有的方法声明,并被告知我只允许使用递归。我已经想尽一切办法去做了,但没有任何运气。
基本上,我们被告知要使用的策略是将链表拆分为2,对两个列表进行混洗(通过递归调用shuffle方法),然后将混洗后的列表合并在一起。
一些你可能需要知道的东西:
- LLN=链表节点
- len="this"列表的长度
- b=要合并"this"的列表
- blen="b"列表的长度
这段代码返回一个空列表,我看不出为什么(显然)。LLN->shuffle()应该返回shuffled列表的头。现在它返回的是一个空列表。
LLN * LLN::merge(int len, LLN *b, int blen) {
//cout << "len: " << len << ", blen: " << blen << endl;
if (len == 0) return b;
if (blen == 0) return this;
int r = rand() % (len + blen) + 1; // between 1 and (len + blen)
if (r <= len) {
if (next)
next = next->merge(len - 1, b, blen);
else
next = b;
return this;
} else {
if (b->getnext())
b->setnext(b->getnext()->merge(blen - 1, this, len));
else
b->setnext(this);
return b;
}
}
LLN *LLN::shuffle(int len) {
if (len == 1)
return this;
LLN *tmp = split();
int thisLength = (len + 1) / 2; // for an odd numbered length, "this" list is 1 node larger
int tmpLength = len / 2;
shuffle(thisLength);
tmp = tmp->shuffle(tmpLength);
return merge(thisLength, tmp, tmpLength);
}
这就是调用该方法的方式。
void LL::shuffle() {
if (head != NULL)
head = head->shuffle(size);
}
LL(链表)对象是用标准的52张卡初始化的(每张卡都是一个节点)。
如果你还需要什么,请告诉我。
非常感谢!
shuffle(thisLength);
tmp = tmp->shuffle(tmpLength);
return merge(thisLength, tmp, tmpLength);
这里shuffle(thisLength)的返回值可能而不是是this,所以我们应该像这个一样
first = shuffle(thisLength);
tmp = tmp->shuffle(tmpLength);
return first->merge(thisLength, tmp, tmpLength);
我在教授的帮助下解决了这个问题。原来我的错误是在split()方法的基本情况下。修好了,一切都很好。我也采纳了查理的建议。
相关文章:
- 如何在 c++ 中比较 2 个链表并将匹配的数据放入另一个链表中
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 重载 == 以递归方式比较两个链表
- 为什么我在尝试添加两个链表时出现此错误?
- 将 2 个链表中包含的相同值写入另一个链表
- 使用多重性函数与 in C++ 联合两个链表
- 如何将 2 个链表合并或合并在一起以创建新列表
- 如何使用超载 运算符组合两个链接列表
- 深度使用两个链接列表的邻接列表的首次搜索C 实现
- 随机合并两个链表
- 我如何合并C 中的两个链接列表
- 合并两个链表产生 seg 错误等
- 合并两个链表,没有重复
- C++我的第一个链表我做错了什么
- 两个链表的并集
- 查找两个链表的交集节点
- 检查两个单链表是否包含相同的数据
- 通过递归 - c++ 将排序的两个链表合并到第三个链表中
- c++合并两个链表分段错误和核心转储错误
- 两个链表的联合 - C++