题解
方法1:递归
主要思路
这个方法的主要思路就是一直递归到尾部,然后从尾部往前逐一反转(之所以没有正向反转是因为反转后会导致经过反转的部分和没有反转的部分之间没有指针连接)
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
if (head == NULL)
//空节点无需处理直接返回
return NULL;
//递归一直往深处走,走到最后发现最后一个节点
struct ListNode* result = reverseList(head->next);
if(head->next == NULL)
{ //到达链表的尾部最后一个节点,反转后就是头部,所以这个要一直返回到开始递归的第一次调用
return head;
}
//反转的主要部分,令当前的下一个节点的next指向自己
head->next->next = head;
head->next = NULL; //这一行主要目的是让反转前的首节点反转后的最后一个节点的next指向NULL,保证是个单向链表
return result; //返回反转前链表的最后一个节点
}
时空复杂度
- 用时:4ms
- 内存:6.3MB