题目:AcWing 35. 反转链表
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
思考题:
请同时实现迭代版本和递归版本。
数据范围
链表长度 [0,30]。
样例
输入:1->2->3->4->5->NULL
输出:5->4->3->2->1->NULL
方法一: 迭代版本
1.使用 指针pre和next分别保存head的前节点和后节点
2.将head当前节点的next指向pre节点,将head指向next后节点
3.循环返回pre节点即可(因为最后有空节点)
/**
* 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) {
if(!head||!head->next)return head;
ListNode *pre=NULL;
while(head)
{
ListNode *next=head->next;
head->next=pre;
pre=head;
head=next;
}
return pre;
}
};
方法二: 递归版本
因为先会递归到最后节点,然后慢慢返回
假设在3节点时,会返回5->4->NULL
1.当前节点的next节点是指向末尾节点
2.只需要使用当前节点找到末尾节点,然后再末尾节点的next指向当前节点即可
3.将当前节点next置为NULL
/**
* 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) {
if(!head||!head->next)return head;
ListNode *tail = reverseList(head->next);
head->next->next=head;
head->next=NULL;
return tail;
}
};