题目
描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤10000≤n≤1000
要求:空间复杂度O(1) ,时间复杂度O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:

示例1
输入:
{1,2,3}
复制返回值:
{3,2,1}
复制
示例2
输入:
{}
复制返回值:
{}
复制说明:
空链表则输出空
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
*
* @param pHead ListNode类
* @return ListNode类
*/
struct ListNode* ReverseList(struct ListNode* pHead )
{
if(pHead==NULL||pHead->next==NULL)
return pHead;
struct ListNode * newhead=ReverseList(pHead->next);
pHead->next->next=pHead;
pHead->next=NULL;
return newhead;
}
执行到struct ListNode *newhead=ReverseList(pHead->next);
时,程序被编译器记录进入栈的位置,并且开始进栈(递归中的递),程序从头开始,每一次到struct ListNode *newhead=ReverseList(phead->next);
时,重复之前的操作,直到最深处——
if(pHead==NULL||pHead->next==NULL)
return pHead;
符合if语句条件,head被返回出来了具体的值——5,于是程序开始出栈(递归中的归),返回到上一层此时pHead=4。由于程序记录了进栈的位置,出栈时就从进栈的下一句开始执行——执行pHead->next->next=pHead;
pHead->next=NULL;
return newhead;
这三句。newhead在执行这三句时没有被操作,所以值不变。每重复一边这三句话pHead的值就减少1。

文章讨论了一个单链表反转的问题,给出了一种使用递归方法在O(1)空间复杂度和O(n)时间复杂度内完成反转的算法。在递归过程中,每次将链表节点的next指针指向前一个节点,直至达到链表尾部并开始回溯,最终得到反转后的链表。
51

被折叠的 条评论
为什么被折叠?



