剑指offerWeek3
周一:反转链表
题目链接:反转链表
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
思考题:
请同时实现迭代版本和递归版本。
数据范围
链表长度 [0,30]
样例
输入:1->2->3->4->5->NULL
输出:5->4->3->2->1->NULL
AC代码
递归版本
/**
* 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;
auto tail = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return tail;
}
};
迭代版本:
/**
* 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) {
auto a = head;
auto b = a; // 主要是使用auto自动推导,懒得打字,hh
b = NULL;
while (a)
{
auto c = a->next;
a->next = b;
b = a, a = c;
}
return b;
}
};
思路:
整体思路
递归版本
返回逆序以后的链表的尾节点
比如说1->2->3->4->5->NULL
第一次递归,就返回节点2
这个时候要使节点2指向节点1,然后让节点1指向NULL
那么就是:
1->next->next = 1;
1->next = NULL;
迭代版本
比如说1->2->3->4->5->NULL
定义三个指针
一个为NULL
一个为节点1
一个为节点2
每次循环的时候就使得当前节点指向上一个节点
然后三个指针依次后移
比如刚开始
节点1指向NULL,然后三个指针后移
然后节点2指向节点1,后移
一直移动到中间的指针为NULL为止