牛客-反串链表:
解题思想:申请新空间保存链表头数据,释放原链表头空间,递归执行
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
struct ListNode* Reverse(struct ListNode* p, struct ListNode* rlist) {
if (p != NULL) {
struct ListNode* a;
struct ListNode* tmp = p;
// print(tmp);
a = (struct ListNode*)malloc(sizeof(p));
a->next = rlist;
a->val = p->val;
p = p->next;
tmp->next = NULL;
free(tmp);
rlist = a;
a = NULL;
newList=rlist;//问题1改动处
newList = Reverse(p, rlist);//问题2改动处
}
return newList;//问题1改动处
}
struct ListNode* ReverseList(struct ListNode* head ) {
// write code here
struct ListNode* p = head;
if (p == NULL)
return NULL;
newList = Reverse(p, newList);
return newList;
}
遇到问题:
1、最初Reverse函数仅当p==NULL时return
报错:non-void function does not return a value in all control paths
解决:return无条件执行
2、递归函数中仅在newList = Reverse(p, rlist);处为newList赋值,且return rlist。
错误:1、递归跳出时rlist更新,最终所得值是最初rlist值,不是期望执行到最后一层的rlist。
2、newList在递归过程中没有发生改变
解决:每次递归函数中修改newList值,并最终返回newList,得到期待递归到最后一层的newList值。