反转链表Ⅱ
链接
https://leetcode-cn.com/problems/reverse-linked-list-ii/
代码
我的代码
基于栈进行反转,比较复杂,空间复杂度比较高,时间复杂度为存在常数的O(n)
/**
* 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* reverseBetween(ListNode* head, int left, int right) {
int count = 1;
ListNode* be = NULL;
ListNode* af = NULL;
ListNode* curr = head;
ListNode* ans;
ListNode* ans_head;
stack<ListNode*> stk;
if(head->next == NULL){
return head;
}
while(count < left){
if(count == left - 1){
be = curr;
}
curr = curr->next;
count++;
}
while(count >= left && count <= right){
stk.push(curr);
count++;
curr = curr->next;
}
af = curr;
ans_head = stk.top();
ans = ans_head;
stk.pop();
while(!stk.empty()){
ans->next = stk.top();
stk.pop();
ans = ans->next;
}
if(be != NULL){
be->next = ans_head;
ans->next = af;
return head;
}else{
ans->next = af;
return ans_head;
}
}
};
优化代码
非常巧妙,对于链表的操作很有指导意义
需要多次复习
巧用next操作
/**
* 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* reverseBetween(ListNode* head, int left, int right) {
int count = 1;
ListNode* pre = NULL;
ListNode* af = NULL;
ListNode* temp = new ListNode(-1);
temp -> next = head;
ListNode* curr = temp;
ListNode* next;
for(int i = 1; i <= left-1; i++){
curr = curr -> next;
}
pre = curr;
curr = curr -> next;
for(int i = left+1; i <= right; i++){
next = curr -> next;
curr -> next = next -> next;
next -> next = pre -> next;
pre -> next = next;
}
return temp -> next;
}
};