传递指针问题



我正在尝试实现我自己版本的链表以进行学习我有以下代码。reverseList函数工作正常,如果我在该函数中打印它,那就很好了。

然而,当我离开函数,然后调用print方法时,我得到了第一个值,然后什么都没有(null(。我猜当我离开函数时,它会让我回到最初的第一个([99](元素,现在它实际上是最后一个元素。所以我的print方法输出元素see null是下一个并结束。

或者我认为我在函数中所做的更改在某种程度上只在该函数的范围内,即使我传递了一个指针,但这没有意义,因为如果是这样的话,那么我应该保留所有原始数据。

struct ListNode
{
int value;
ListNode* next = NULL;
};
void insertRecList(ListNode* list, int value)
{
if(list->next == NULL)
{
ListNode* end = new ListNode;
end->value = value;
list->next = end;
}
else
insertRecList(list->next, value);
}
void printList(ListNode* list)
{
std::cout << list->value << std::endl;
while(list->next != NULL)
{
list = list->next;
std::cout << list->value << std::endl;
}
}
void reverseList(ListNode* list)
{
ListNode* next;
ListNode* prev  = NULL;
ListNode* cur   = list;
while(cur != NULL)
{
if(cur->next == NULL)
{     
cur->next = prev;
break;
}
else
{
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
}
list = cur;
std::cout << cur->value << " list:" <<  list->value << std::endl;
}
void testLinkedList()
{
srand(time(NULL));
ListNode nodes;
nodes.value = 99;
int val;
for(int i = 0; i < 5; i++)
{
val = rand() % 30 + 1;
insertRecList(&nodes, i);
//insertList(&nodes, val);
}
printList(&nodes);
reverseList(&nodes);
printList(&nodes);
}
int main()
{
testLinkedList();
return 0;
}

感谢你们能给我的任何帮助,

谢谢!

更新:通过将ListNode *list传递给reverseList,可以创建指向与nodes相同地址的指针的副本。在函数中,您将list分配给更新的cur指针,但副本将在最后销毁。CCD_ 6仍然指向与传递到CCD_ 7之前相同的地址,但是其CCD_。

我对你的代码做了一点修改:

#include <cstdlib>
#include <iostream>
struct ListNode
{
int value;
ListNode* next = nullptr;
};
void insertRecList(ListNode* list, int value)
{
if(list->next == nullptr)
{
ListNode* end = new ListNode;
end->value = value;
list->next = end;
}
else
insertRecList(list->next, value);
}
void printList(ListNode* list)
{
std::cout << list->value << std::endl;
while(list->next != nullptr)
{
list = list->next;
std::cout << list->value << std::endl;
}
}
void reverseList(ListNode** list)
{
ListNode* cur   = *list;
ListNode* next  = cur->next;
ListNode* prev  = nullptr;
while(cur != nullptr)
{
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
*list = prev;
}
void cleanNodes(ListNode *list) {
// clean goes here
}
void testLinkedList()
{
srand(time(nullptr));
ListNode *nodes = new ListNode();
nodes->value = 99;
int val;
for(int i = 0; i < 5; i++)
{
val = rand() % 30 + 1;
insertRecList(nodes, i);
//insertList(&nodes, val);
}
printList(nodes);
reverseList(&nodes);
printList(nodes);
cleanNodes(nodes);
}
int main()
{
testLinkedList();
return 0;
}

尝试使用:-std=gnu++11 进行编译

您没有在reverseList中更改nodes,您只是在更改list,您只是更改结构上的一个指针,该结构是一个临时对象,因此物理节点是相同的,并指向相同的第一个元素,该元素现在具有指向Nullnext属性,因此printList的结果是正确的。你需要使用指针,例如

#include <iostream>
#include <cstdlib>

struct ListNode
{
int value;
ListNode* next = NULL;
~ListNode(){
if(this->next)
delete this->next;
}
};
void insertRecList(ListNode* list, int value)
{
if(list->next == NULL)
{
ListNode* end = new ListNode;
end->value = value;
list->next = end;
}
else
insertRecList(list->next, value);
}
void printList(ListNode* list)
{
std::cout << list->value << std::endl;
while(list->next != NULL)
{
list = list->next;
std::cout << list->value << std::endl;
}
}
ListNode * reverseList(ListNode* list)
{
ListNode* next;
ListNode* prev  = NULL;
ListNode* cur   = list;
while(cur != NULL)
{
if(cur->next == NULL)
{
cur->next = prev;
break;
}
else
{
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
}
std::cout << cur->value << " list:" <<  list->value << std::endl;
return cur;
}
void testLinkedList()
{
srand(time(NULL));
ListNode * nodes = new ListNode;
nodes->value = 99;
int val;
for(int i = 0; i < 5; i++)
{
val = rand() % 30 + 1;
insertRecList(nodes, i);
//insertList(&nodes, val);
}
printList(nodes);
nodes = reverseList(nodes);
printList(nodes);
delete nodes;
}
int main()
{
testLinkedList();
return 0;
}

另外,不要忘记删除动态创建的对象

反转链表不是一项基本操作。它不属于类的基本运算。在其他操作中实施它更容易(也更安全(。大致:

  • 创建一个空列表
  • 当第一个列表不为空时,从第一个列表的前面删除一个节点,然后将其插入第二个列表的开头

第二个列表现在与原始列表相反。

相关内容

  • 没有找到相关文章

最新更新