题目描述
- 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
前期准备工作
ListNode* createList()
{
ListNode *head = NULL;
ListNode *tail = NULL;
for(int i = 0; i < 10 ; ++i)
{
ListNode *p = new ListNode ;
p->val = i;
p->next = NULL;
if(!head)
{
head = p;
tail = head;
}
else
{
tail->next = p;
}
tail = p;
}
return head;
}
void printList(ListNode *head)
{
ListNode *p = NULL;
p = head;
while(p)
{
cout << p->val << " " ;
p = p->next;
}
cout<<endl;
}
解题思路
- 使用普通数组做函数参数,在子函数中采用递归修改数组元素值
注意点:此处,我们让数组的索引进行无返回值的变化,故设置为指针类型。实参用&传递地址,形参用*修改内存值
void arr_To_list_rever(int arr[],ListNode *head,int *index)
{
if(head)
{
arr_To_list_rever(arr,head->next,index);
arr[*index] = head->val; //
++ (*index);//
}
else
{
//什么都不做
}
}
void printArr(int arr[],int *index)
{
if(index == 0)
{
cout << "链表为空" << endl;
}
else
{
for(int i = 0; i<index; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}
}
int main()
{
ListNode *head;
head = createList();
printList(head);
int index = 0;
int arr[20] = {0};
arr_to_list_rever(arr ,head , &index);
printArr(arr , &index);
}
void arr_to_list_rever(int arr[],ListNode *head,int &index)
{
if(head)
{
arr_to_list_rever(arr,head->next,index);
arr[index] = head->val;
++index;
}
}
void printArr(int arr[],int &index)
{
if(index == 0)
{
cout << "链表为空" << endl;
}
else
{
for(int i = 0; i<index; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}
}
int main()
{
ListNode *head;
head = createList();
printList(head);
int index = 0;
int arr[20] = {0};
arr_to_list_rever(arr ,head , index);
printArr(arr , index);
}
- 定义变量或者输入输出时,需要前后空格,让代码变得更加美观
- 定义变量名或者函数名时,尽量使用驼峰命名规则
- 尽量封装代码,使代码更加简洁
- for循环中尽量使用++i这样,不用每次循环过程都保存一个i的临时变量,而是直接先递增再运算。