Skip to content

Commit fd1006a

Browse files
authored
92. Reverse Linked List II
1 parent f66d719 commit fd1006a

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

92. Reverse Linked List II

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//T.c -O(n)
2+
//s.C -O(1)
3+
4+
// function used to reverse a linked list
5+
ListNode* reverse(ListNode* head)
6+
{
7+
ListNode* prev = NULL;
8+
ListNode* curr = head;
9+
while (curr) {
10+
ListNode* next = curr->next;
11+
curr->next = prev;
12+
prev = curr;
13+
curr = next;
14+
}
15+
return prev;
16+
}
17+
18+
ListNode* reverseBetween(ListNode* head, int left, int right) {
19+
// function used to reverse a linked list from position m to n
20+
if (left == right)
21+
return head;
22+
23+
// revs and revend is start and end respectively of the
24+
// portion of the linked list which need to be reversed.
25+
// revs_prev is previous of starting position and
26+
// revend_next is next of end of list to be reversed.
27+
ListNode*revs = NULL, *revs_prev = NULL;
28+
ListNode*revend = NULL, *revend_next = NULL;
29+
30+
// Find values of above pointers.
31+
int i = 1;
32+
ListNode* curr = head;
33+
while (curr && i <= right) {
34+
if (i < left)
35+
revs_prev = curr;
36+
if (i == left)
37+
revs = curr;
38+
if (i == right) {
39+
revend = curr;
40+
revend_next = curr->next;
41+
}
42+
curr = curr->next;
43+
i++;
44+
}
45+
revend->next = NULL;
46+
// Reverse linked list starting with revs.
47+
revend = reverse(revs);
48+
// If starting position was not head
49+
if (revs_prev)
50+
revs_prev->next = revend;
51+
// If starting position was head
52+
else
53+
head = revend;
54+
revs->next = revend_next;
55+
return head;
56+
}
57+
58+
59+
};

0 commit comments

Comments
 (0)