我做了一个应该反转我的链表的算法。原始列表看起来像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;
}
{{1}}
答案 0 :(得分:1)
您的算法无效,因为 在第一个循环中 将前n-1个节点中的数据复制到数组dataHolder中 然后在第二个循环中,按照检索到的顺序将数组复制到链接列表中。
此外,您正在编辑您的&#34;开始&#34;变量,它是列表开头的唯一引用
在第二个循环结束时,开始指向列表中的第二个最后一个节点
并使用相同的&#34; start&#34;显示链接列表。变量
输入的数据
7-将5-→6
处理完第一个循环后
在数据持有人中
7 5
将其复制到链接列表中。
链接列表现在是
7-大于5
但是开始指向5
使用start显示链接列表 很明显 5只会打印
答案 1 :(得分:0)
两个循环都缺少一个元素,您应该迭代直到当前节点为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++;
}
附录:
实际上,您可以在不使用任何额外内存的情况下反转O(n)中的链接列表(并且无需预先计算其长度),只需重新排序指针即可。在某些情况下,这可能是不可接受的(例如,如果您有外部指针或对节点的引用,当您反转列表时期望看到它们的值发生变化),但大多数情况下都没问题。它会是这样的:
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;
}