【leetcode刷题记录】206. 反转链表
题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
迭代
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* rev = nullptr, *p = head;
//每次循环,都将当前节点指向它前面的节点,然后当前节点和前节点后移
while(p){
ListNode* tmp = p->next;
p->next = rev;
rev = p;
p = tmp;
}
return rev;
}
};
递归
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head) return NULL;
if(!head->next) return head;
// 反转当前节点后面的更短(更更短)的链表
ListNode* p = reverseList(head->next);
// 原链表的第二个节点(head->next)现链表的尾节点后面挂接原链表的头节点
head->next->next = head;
// 原链表头节点指向空
head->next = NULL;
return p;
}
};