我制作了一种算法,该算法应逆转我的链接列表。原始列表看起来像7 5 6
,我想将其倒转为5 6 7
。但是,当反向函数之后打印出链接列表时,我只看到 5
NodeType * temp = start;
int dataHolder[length] = {0};
int runTime = length - 1;
for(int i = 0; i<length; i++){
if(temp->next == NULL){
break;
}
dataHolder[runTime] = temp->data;
temp = temp->next;
runTime--;
}
for(int j = 0; j<length; j++){
if(start->next == NULL){
break;
}
start->data = dataHolder[j];
start = start->next;
}
您的算法不起作用,因为在第一个循环中第一个N-1节点中的数据已复制到Array DataHolder中然后,在第二个循环中,您将数组以与检索的顺序相同的顺序复制到链接列表中。
加上您正在编辑"启动"变量,这是列表开始
的唯一引用在第二个循环起点的末尾指向列表中的第二个节点
您使用相同的" start"变量显示链接列表
对于您的输入数据
7-> 5-> 6
处理第一循环后在dataholder
中7 5
将其复制到链接列表中。链接列表现在
7-> 5
但是开始指向5
使用开始显示链接列表很明显5只会打印
两个循环都缺少一个元素,您应该迭代直到当前节点为 NULL
,直到下一个节点为止。实际上,您可以将该条件放在while
循环中,而不是使用for
循环,这对于链接列表可能更合理(即使您已经预先计算了长度(。我还怀疑您正在使用相同的start
变量检查结果,这是不起作用的,因为您正在覆盖它。尝试这样的事情:
NodeType * temp = start;
int dataHolder[length] = {0};
int runTime = length - 1;
while (temp != NULL) {
dataHolder[runTime] = temp->data;
temp = temp->next;
runTime--;
}
temp = start;
runtime = 0;
while (temp != NULL) {
temp->data = dataHolder[runtime];
temp = temp->next;
runtime++;
}
附录:
实际上,您可以通过重新排序指针,而无需使用任何其他内存(并且不需要预先计算其长度(,而无需使用任何其他内存(并且不需要预先计算其长度(。在某些情况下,这可能是不可接受的(例如,如果您有外部指针或对节点的引用,那么当您扭转列表时会看到其价值会发生变化(,但是大多数情况下它很好。它会像这样:
NodeType * temp1 = start; // Assuming start is not NULL
NodeType * temp2 = start->next;
start->next = NULL;
while (temp2 != NULL) {
NodeType * temp3 = temp2->next;
temp2->next = temp1;
temp1 = temp2;
temp2 = temp3;
}