Sponsored
Sponsored
This approach involves reversing the second half of the linked list and then comparing it with the first half. If they are identical, the linked list is a palindrome. The steps include:
Time Complexity: O(n) since we are traversing the list multiple times but each in linear time.
Space Complexity: O(1) as we are reversing the linked list in place.
1#include <stdbool.h>
2#include <stdio.h>
3
4struct ListNode {
5 int val;
6 struct ListNode *next;
7};
8
9struct ListNode* reverseList(struct ListNode* head) {
10 struct ListNode* prev = NULL;
11 struct ListNode* current = head;
12 struct ListNode* next = NULL;
13 while (current != NULL) {
14 next = current->next;
15 current->next = prev;
16 prev = current;
17 current = next;
18 }
19 return prev;
20}
21
22bool isPalindrome(struct ListNode* head) {
23 if (head == NULL || head->next == NULL) return true;
24 struct ListNode* slow = head;
25 struct ListNode* fast = head;
26 while (fast != NULL && fast->next != NULL) {
27 slow = slow->next;
28 fast = fast->next->next;
29 }
30 struct ListNode* reversedSecondHalf = reverseList(slow);
31 struct ListNode* p1 = head;
32 struct ListNode* p2 = reversedSecondHalf;
33 while (p2 != NULL) {
34 if (p1->val != p2->val) return false;
35 p1 = p1->next;
36 p2 = p2->next;
37 }
38 return true;
39}The above solution in C reverses the second half of the linked list starting from the middle. We use a fast and slow pointer to find the middle together with reversing the second half and checking for equality.
In this approach, convert the linked list into an array and utilize a two-pointer technique to determine if it forms a palindrome. The steps are as follows:
Time Complexity: O(n) due to single traversation and subsequent O(n/2) check.
Space Complexity: O(n) because we store all node values in an array.
1
This C solution creates an array as large as the linked list to store values, which are then checked for palindromic order using two index pointers.