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