反转一个单链表
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
方法一:递归
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == nullptr || head->next == nullptr){
return head;
}
ListNode* last = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return last;
}
};
方法二:迭代
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = nullptr;
ListNode* cru = head;
ListNode* nxt = head;
while(cru != nullptr){
nxt = cru->next;
cru->next = pre;
pre = cru;
cru = nxt;
}
return pre;
}
};
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
- 1 ≤ m ≤ n ≤ 链表长度
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
方法一:递归
class Solution {
public:
ListNode* successor = nullptr; //后驱节点
ListNode* reverseN(ListNode* head,int n){
if(n == 1){
successor = head->next;
return head;
}
ListNode* last = reverseN(head->next,n-1);
head->next->next = head;
head->next = successor;
return last;
}
ListNode* reverseBetween(ListNode* head, int left, int right) {
if(left == 1){
return reverseN(head,right);
}
head->next = reverseBetween(head->next,left - 1,right - 1);
return head;
}
};