反向链接列表算法

Reverse Linked List Algorithm

本文关键字:算法 列表 链接      更新时间:2023-10-16

我制作了一种算法,该算法应逆转我的链接列表。原始列表看起来像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;
}