1. 题目来源
链接:反转链表
来源:LeetCode——《剑指-Offer》专项
2. 题目说明
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
- 0 <= 节点个数 <= 5000
3. 题目解析
方法一:三指针原地逆置、迭代解法
题意明确,采用链表的三指针原地逆置轻松搞定!
参见代码如下:
// 执行用时 :8 ms, 在所有 C++ 提交中击败了68.92%的用户
// 内存消耗 :10.2 MB, 在所有 C++ 提交中击败了100.00%的用户
/**
* 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==nullptr)
return head;
ListNode* pre = NULL;
ListNode* cur = head;
ListNode* next = NULL;
while (cur != NULL) {
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}
};
方法二:递归解法
优雅递归解法。
参见代码如下:
// 执行用时 :8 ms, 在所有 C++ 提交中击败了68.92%的用户
// 内存消耗 :10.4 MB, 在所有 C++ 提交中击败了100.00%的用户
/**
* 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 == nullptr || head->next == nullptr) {
return head;
}
ListNode* node = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return node;
}
};
方法三:栈
该方法不想实现了,在此题中并不优越。列到这就是为了警醒下自己,看到逆置、倒序别忘记栈就行!