/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//反转链表 ,有两种解法思路,一种迭代,一种递归。时间复杂度 o(n);
//1.迭代,即将所有链表节点的next指针指向前一个节点,最后输出原最后一个节点为头结点即可
//2.递归,递归思想很重要,本题先考虑reverseList函数的功能是反转链表并输出头结点,所以可以考虑递归实现
//2.先递归处理head->next,然后将该节点的next指针指向原头结点head,再将head->next设为NULL,后将原链表最后节点作为头结点返回
/* 第一种迭代解法
ListNode* a=NULL;
ListNode *b=head; //设两个变量表示前后两节点,从head结点开始. 将b设为head,a设为NULL;
while(b)
{
auto c=b->next;//新建一个临时变量保存b的下一个结点
b->next=a; //将后一个节点的next指针指向前一个节点
a=b; //将前一个节点更新为后一个节点,以便之后循环
b=c; //更新后一个节点为再后一个节点
}
return a;*/
//第二种递归解法
if(!head||!head->next) return head; //如果链表为空,或只有一个节点,则直接返回head
ListNode *tail=reverseList(head->next); //用递归思路,先将原尾结点作为头结点返回
head->next->next=head; //将head->next节点的next指针设为原头结点;
head->next=NULL; //将原head节点的next指针设为NULL;
return tail;
}
};
10-07
223
10-07
1387