forked from Nimesh-Srivastava/DSA
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path0234.cpp
More file actions
46 lines (40 loc) · 1.34 KB
/
Copy path0234.cpp
File metadata and controls
46 lines (40 loc) · 1.34 KB
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
/**
* 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) {}
* };
*/
// we do this question by reversing the first half of
// LL, placing a pointer on the head of first and second halves each,
// and then comparing the halves element by element
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(!head || !head->next)
return true;
ListNode* curr = head, *prev = NULL, *mov1 = head, *mov2 = head;
//reverse first half of LL and place mov1 pointer on
//head of second half
while(mov2 && mov2->next){
curr = mov1;
mov1 = mov1->next;
mov2 = mov2->next->next;
curr->next = prev;
prev = curr;
}
//if odd number of elements
if(mov2)
mov1 = mov1->next;
//comparing first and second halves till prev is not NULL
while(prev && prev->val == mov1->val){
prev = prev->next;
mov1 = mov1->next;
}
//if prev = NULL, it means we have reached the end, hence, return true, else return false
return !prev;
}
};