反向链接列表算法

时间:2017-06-22 13:41:15

标签: c++ algorithm linked-list

我做了一个应该反转我的链表的算法。原始列表看起来像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}}

2 个答案:

答案 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;
}