大家先来看看这样一段代码,看能否自己得出输出结果。
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
int a[10000];
int n;
void creatLinkedList(ListNode *&cur, int i)
{
if (i == n)return ;
cur = new ListNode(a[i]);
creatLinkedList(cur->next, i+1);
}
int main()
{
while (cin >> n){
ListNode *head1 = NULL;
ListNode *head2 = NULL;
ListNode *cur = head1;
for (int i = 0; i < n; i ++){
cin>>a[i];
if (i)cur = new ListNode(a[i]);
else {
head1 = new ListNode(a[0]);
cur = head1;
}
cur = cur -> next;
}
cur = head2;
creatLinkedList(head2, 0);
cur = head1;
cout<<"created by iteration:";
while (cur != NULL){
cout << cur->val<<' ';
cur = cur->next;
}
cout <<endl;
cur = head2;
cout<<"created by recursion:";
while (cur != NULL){
cout << cur->val<<' ';
cur = cur->next;
}
cout <<endl;
}
}
是不是结果应该是一模一样的,那说明你还没有深入理解代码背后的一些操作,不卖关子了,其计算结果应该是这样的:
原因就在于,当使用上述方式的迭代建立链表时,cur每次都会指向NULL,而NULL的存储位置是内存中固定的一个地址,这样当cur=cur->next的时候,就等于cur=NULL,因此cur和其前驱的关系实际上已经断开了,因此原想做成的链已经被拆成一个个单一的节点,而使用递归时,程序控制参数从右向左一一入栈,产生一个参数的副本,当传递cur->next的时候相当于有一个cur->next = new ListNode的过程,因此连接得以保留。
因此如果要使用迭代创建链表的话,应当这么写,即先保护好联系再跳转:
ListNode *head = NULL;
ListNode *cur = NULL;
for (int i = 0; i < n; i ++){
int a;
cin >> a;
if (!i)
{
cur = new ListNode(a);
head = cur;
}
else{
cur->next = new ListNode(a);
cur = cur -> next;
}
}