Skip to content

Commit 6868bf8

Browse files
Add palindrome singly linkedlist optimised approach (#5617)
1 parent 4a5bf39 commit 6868bf8

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

src/main/java/com/thealgorithms/misc/PalindromeSinglyLinkedList.java

+43
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,47 @@ public static boolean isPalindrome(final SinglyLinkedList linkedList) {
3030

3131
return true;
3232
}
33+
34+
// Optimised approach with O(n) time complexity and O(1) space complexity
35+
36+
public static boolean isPalindromeOptimised(Node head) {
37+
if (head == null || head.next == null) {
38+
return true;
39+
}
40+
Node slow = head;
41+
Node fast = head;
42+
while (fast != null && fast.next != null) {
43+
slow = slow.next;
44+
fast = fast.next.next;
45+
}
46+
Node midNode = slow;
47+
48+
Node prevNode = null;
49+
Node currNode = midNode;
50+
Node nextNode;
51+
while (currNode != null) {
52+
nextNode = currNode.next;
53+
currNode.next = prevNode;
54+
prevNode = currNode;
55+
currNode = nextNode;
56+
}
57+
Node left = head;
58+
Node right = prevNode;
59+
while (left != null && right != null) {
60+
if (left.val != right.val) {
61+
return false;
62+
}
63+
right = right.next;
64+
left = left.next;
65+
}
66+
return true;
67+
}
68+
static class Node {
69+
int val;
70+
Node next;
71+
Node(int val) {
72+
this.val = val;
73+
this.next = null;
74+
}
75+
}
3376
}

src/test/java/com/thealgorithms/misc/PalindromeSinglyLinkedListTest.java

+72
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.junit.jupiter.api.Test;
88

99
public class PalindromeSinglyLinkedListTest {
10+
11+
// Stack-based tests
1012
@Test
1113
public void testWithEmptyList() {
1214
assertTrue(PalindromeSinglyLinkedList.isPalindrome(new SinglyLinkedList()));
@@ -67,4 +69,74 @@ public void testWithListWithEvenLengthNegative() {
6769
exampleList.insert(20);
6870
assertFalse(PalindromeSinglyLinkedList.isPalindrome(exampleList));
6971
}
72+
73+
// Optimized approach tests
74+
@Test
75+
public void testOptimisedWithEmptyList() {
76+
assertTrue(PalindromeSinglyLinkedList.isPalindromeOptimised(null));
77+
}
78+
79+
@Test
80+
public void testOptimisedWithSingleElement() {
81+
PalindromeSinglyLinkedList.Node node = new PalindromeSinglyLinkedList.Node(100);
82+
assertTrue(PalindromeSinglyLinkedList.isPalindromeOptimised(node));
83+
}
84+
85+
@Test
86+
public void testOptimisedWithOddLengthPositive() {
87+
PalindromeSinglyLinkedList.Node node1 = new PalindromeSinglyLinkedList.Node(1);
88+
PalindromeSinglyLinkedList.Node node2 = new PalindromeSinglyLinkedList.Node(2);
89+
PalindromeSinglyLinkedList.Node node3 = new PalindromeSinglyLinkedList.Node(1);
90+
node1.next = node2;
91+
node2.next = node3;
92+
assertTrue(PalindromeSinglyLinkedList.isPalindromeOptimised(node1));
93+
}
94+
95+
@Test
96+
public void testOptimisedWithOddLengthPositive2() {
97+
PalindromeSinglyLinkedList.Node node1 = new PalindromeSinglyLinkedList.Node(3);
98+
PalindromeSinglyLinkedList.Node node2 = new PalindromeSinglyLinkedList.Node(2);
99+
PalindromeSinglyLinkedList.Node node3 = new PalindromeSinglyLinkedList.Node(1);
100+
PalindromeSinglyLinkedList.Node node4 = new PalindromeSinglyLinkedList.Node(2);
101+
PalindromeSinglyLinkedList.Node node5 = new PalindromeSinglyLinkedList.Node(3);
102+
node1.next = node2;
103+
node2.next = node3;
104+
node3.next = node4;
105+
node4.next = node5;
106+
assertTrue(PalindromeSinglyLinkedList.isPalindromeOptimised(node1));
107+
}
108+
109+
@Test
110+
public void testOptimisedWithEvenLengthPositive() {
111+
PalindromeSinglyLinkedList.Node node1 = new PalindromeSinglyLinkedList.Node(10);
112+
PalindromeSinglyLinkedList.Node node2 = new PalindromeSinglyLinkedList.Node(20);
113+
PalindromeSinglyLinkedList.Node node3 = new PalindromeSinglyLinkedList.Node(20);
114+
PalindromeSinglyLinkedList.Node node4 = new PalindromeSinglyLinkedList.Node(10);
115+
node1.next = node2;
116+
node2.next = node3;
117+
node3.next = node4;
118+
assertTrue(PalindromeSinglyLinkedList.isPalindromeOptimised(node1));
119+
}
120+
121+
@Test
122+
public void testOptimisedWithOddLengthNegative() {
123+
PalindromeSinglyLinkedList.Node node1 = new PalindromeSinglyLinkedList.Node(1);
124+
PalindromeSinglyLinkedList.Node node2 = new PalindromeSinglyLinkedList.Node(2);
125+
PalindromeSinglyLinkedList.Node node3 = new PalindromeSinglyLinkedList.Node(2);
126+
node1.next = node2;
127+
node2.next = node3;
128+
assertFalse(PalindromeSinglyLinkedList.isPalindromeOptimised(node1));
129+
}
130+
131+
@Test
132+
public void testOptimisedWithEvenLengthNegative() {
133+
PalindromeSinglyLinkedList.Node node1 = new PalindromeSinglyLinkedList.Node(10);
134+
PalindromeSinglyLinkedList.Node node2 = new PalindromeSinglyLinkedList.Node(20);
135+
PalindromeSinglyLinkedList.Node node3 = new PalindromeSinglyLinkedList.Node(20);
136+
PalindromeSinglyLinkedList.Node node4 = new PalindromeSinglyLinkedList.Node(20);
137+
node1.next = node2;
138+
node2.next = node3;
139+
node3.next = node4;
140+
assertFalse(PalindromeSinglyLinkedList.isPalindromeOptimised(node1));
141+
}
70142
}

0 commit comments

Comments
 (0)