struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} };
有一个函数利用LisNode生成了一个链表,返回头指针ListNode* head。
但是由于是局部变量所以返回头指针后局部变量就都丢失了,head->next指向的指针丢失了,导致读不出来head之后的节点。
发现问题在于用了如下的形式对指针赋值
ListNode h(0);
ListNode* head=&h;
这样函数返回后,h的值丢失,导致head->next丢失。
解决方法是,全部用ListNode* ptr = new ListNode(0);
这样用new分配了内存,而new类似于malloc,分配的空间在堆heap上而非栈stack上,不会丢失。
#include <iostream> #pragma once #include <iostream> using namespace std; struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* SolveB(int n) { /* your code starts here */ //construct a list accrording to input int value; cin >> value; ListNode* head = new ListNode(0); head->val = value; ListNode* temp = new ListNode(0); head->next = temp; for (int i = 1; i < n; i++) { if (i <= n - 2) { cin >> value; temp->val = value; ListNode* p =new ListNode(0); temp->next = p; temp = p; } else { cin >> value; temp->val = value; temp->next = NULL; } } ListNode* odd = head; ListNode* even = head->next; ListNode* evenhead = even; if(odd!=NULL){ while((even!=NULL)&&(even->next!=NULL)){ odd->next = odd->next->next; even->next = even->next->next; odd = odd->next; even = even->next; } odd->next = evenhead; } return head; } int main() { int n; cin >> n; // get the head node of rearranged list ListNode* ls = SolveB(n); for (int i = 0; i < n; i++) { cout << ls->val << " "; ls = ls->next; } system("pause"); return 0; }