-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathreverse_linkedList_ii.cpp
68 lines (56 loc) · 2 KB
/
reverse_linkedList_ii.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
* 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) {
/*
1 -> 2 -> 3 -> 4 -> 5 -> 6
mth m n nth
prev next
1 -> 2 3 <- 4 <- 5 6
mth m n nth
prev | ^ next
|-----|-------------| ^
|---------------------|
mthprev=>next = n;
m=>next = nthnext;
*/
ListNode *current = head, *prev = head, *next = head, *mth = NULL, *nth = NULL, *mthPrev = NULL, *nthNext = NULL;
for(int i = 1; current != NULL; i++) {
//based on standard reverse LL
//keep track of next node when we reverse
next = current->next; //ncn
if(i == left) {
mth = current;
mthPrev = prev;
}
//reverse next ptr to point to prev nodes.
if(i > left and i <= right) {
current->next = prev; //cnp
}
if(i == right) {
nth = current;
nthNext = next;
}
prev = current; //pc
current = next; //cn
}
if(left == 1) { //if m is the first node in LL
mth->next = nthNext;
head = nth;
}
else {
mthPrev->next = nth;
mth->next = nthNext;
}
return head;
}
};