反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
这题用迭代的思路非常简单,有很多种思路,可以直接头插,可以直接一个个去改变指针指向,复杂度都是O(N),可以说是比较简单高效的算法了都。但是这题用递归的话就要费点心思了。
这题想要递归,那么我们需要清楚这个递归肯定是从头结点开始一直递归到尾结点
- 1、先要确定终止条件。
如果是一个节点或者没有节点,那么反转就是其本身。 - 2、确定在递归过程中需要做什么。
我们的目的其实很简单表面上
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
但是其实是
输入: 1->2->3->4->5->NULL
输出: NULL<-1<-2<-3<-4<-5
修改指针指向的位置。
我们以2这个节点为例子,我们要修改他的下一个节点不再是3,而是2。3也是这样要修改他的下一个节点不再是4,而是2。
-3、注意点
我们要注意头和尾的处理
这里的原本的尾部是5,我们要让他指向4,这个没有其他的处理,但是原本的头部1,我们要进行处理将其指向NULL。
经过分析后代码
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==NULL||head->next==NULL){
return head;
}
ListNode *p=reverseList(head->next);//p是我们要返回的节点,一直遍历到递归终止我们可以得到的是5节点
head->next->next=head;//我们进行修改,head此时是4为例,4的原本下一个节点是5,5的下一个节点修改为4,形成反置
head->next=NULL;//最后再把4节点的下一个置为空,反正返回到上一层会重新置为3,这一步是针对头结点的。
return p;
}
};