我想生成一个由用户选择的固定长度的随机双链表。
列表会在列表的开头插入第一个值,然后在列表的末尾插入所有其他值,但是不能正确调整指针。
头和尾节点都在main中初始化为NULL
。
随机值起作用,问题出在指针上,因为在第二次迭代中,尾部保持与头部相同,这意味着列表没有增加。
void GenRandSeq(struct Node* &head, struct Node* &tail, int len){
int i = 0;
std::mt19937 rng;
std::uniform_int_distribution<uint32_t> uint_dist(0,10000);
while (i < len){
Node* newNode = new Node();
int new_el = uint_dist(rng);
newNode->key = new_el;
newNode->prev = NULL;
newNode->next = NULL;
if (head == NULL){
tail = newNode;
head = newNode;
}
else{
if (tail != NULL){
newNode->next = NULL;
newNode->prev = tail;
tail->next = newNode;
}
else
tail = newNode;
}
i++;
}
}
我看不到代码中缺少的内容。
答案 0 :(得分:2)
tail
。当head
和tail
都不为空时(当列表不为空时应始终为true),则不会更新tail
指向新创建的节点。 tail
的分配需要从else
语句中移出。您要将新节点追加到列表的末尾,因此tail
必须在每次循环迭代中进行更新。
请尝试以下类似操作:
void GenRandSeq(Node* &head, Node* &tail, int len){
std::mt19937 rng;
std::uniform_int_distribution<uint32_t> uint_dist(0,10000);
while (len > 0){
Node* newNode = new Node;
newNode->key = uint_dist(rng);
newNode->prev = tail;
newNode->next = nullptr;
if (!head){
head = newNode;
}
if (tail){
tail->next = newNode;
}
tail = newNode;
--len;
}
}
通过消除循环内的if
语句,可以进一步简化以下内容:
void GenRandSeq(Node* &head, Node* &tail, int len){
std::mt19937 rng;
std::uniform_int_distribution<uint32_t> uint_dist(0,10000);
Node **next = (tail) ? &(tail->next) : &head;
while (len > 0){
Node *newNode = new Node;
newNode->key = uint_dist(rng);
newNode->prev = tail;
newNode->next = nullptr;
*next = newNode;
tail = newNode;
next = &(newNode->next);
--len;
}
}