Skip to content

Palindrome singly linkedlist optimised approach #5617

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,47 @@ public static boolean isPalindrome(final SinglyLinkedList linkedList) {

return true;
}

// Optimised approach with O(n) time complexity and O(1) space complexity

public static boolean isPalindromeOptimised(Node head) {
if (head == null || head.next == null) {
return true;
}
Node slow = head;
Node fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
Node midNode = slow;

Node prevNode = null;
Node currNode = midNode;
Node nextNode;
while (currNode != null) {
nextNode = currNode.next;
currNode.next = prevNode;
prevNode = currNode;
currNode = nextNode;
}
Node left = head;
Node right = prevNode;
while (left != null && right != null) {
if (left.val != right.val) {
return false;
}
right = right.next;
left = left.next;
}
return true;
}
static class Node {
int val;
Node next;
Node(int val) {
this.val = val;
this.next = null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import org.junit.jupiter.api.Test;

public class PalindromeSinglyLinkedListTest {

// Stack-based tests
@Test
public void testWithEmptyList() {
assertTrue(PalindromeSinglyLinkedList.isPalindrome(new SinglyLinkedList()));
Expand Down Expand Up @@ -67,4 +69,74 @@ public void testWithListWithEvenLengthNegative() {
exampleList.insert(20);
assertFalse(PalindromeSinglyLinkedList.isPalindrome(exampleList));
}

// Optimized approach tests
@Test
public void testOptimisedWithEmptyList() {
assertTrue(PalindromeSinglyLinkedList.isPalindromeOptimised(null));
}

@Test
public void testOptimisedWithSingleElement() {
PalindromeSinglyLinkedList.Node node = new PalindromeSinglyLinkedList.Node(100);
assertTrue(PalindromeSinglyLinkedList.isPalindromeOptimised(node));
}

@Test
public void testOptimisedWithOddLengthPositive() {
PalindromeSinglyLinkedList.Node node1 = new PalindromeSinglyLinkedList.Node(1);
PalindromeSinglyLinkedList.Node node2 = new PalindromeSinglyLinkedList.Node(2);
PalindromeSinglyLinkedList.Node node3 = new PalindromeSinglyLinkedList.Node(1);
node1.next = node2;
node2.next = node3;
assertTrue(PalindromeSinglyLinkedList.isPalindromeOptimised(node1));
}

@Test
public void testOptimisedWithOddLengthPositive2() {
PalindromeSinglyLinkedList.Node node1 = new PalindromeSinglyLinkedList.Node(3);
PalindromeSinglyLinkedList.Node node2 = new PalindromeSinglyLinkedList.Node(2);
PalindromeSinglyLinkedList.Node node3 = new PalindromeSinglyLinkedList.Node(1);
PalindromeSinglyLinkedList.Node node4 = new PalindromeSinglyLinkedList.Node(2);
PalindromeSinglyLinkedList.Node node5 = new PalindromeSinglyLinkedList.Node(3);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
assertTrue(PalindromeSinglyLinkedList.isPalindromeOptimised(node1));
}

@Test
public void testOptimisedWithEvenLengthPositive() {
PalindromeSinglyLinkedList.Node node1 = new PalindromeSinglyLinkedList.Node(10);
PalindromeSinglyLinkedList.Node node2 = new PalindromeSinglyLinkedList.Node(20);
PalindromeSinglyLinkedList.Node node3 = new PalindromeSinglyLinkedList.Node(20);
PalindromeSinglyLinkedList.Node node4 = new PalindromeSinglyLinkedList.Node(10);
node1.next = node2;
node2.next = node3;
node3.next = node4;
assertTrue(PalindromeSinglyLinkedList.isPalindromeOptimised(node1));
}

@Test
public void testOptimisedWithOddLengthNegative() {
PalindromeSinglyLinkedList.Node node1 = new PalindromeSinglyLinkedList.Node(1);
PalindromeSinglyLinkedList.Node node2 = new PalindromeSinglyLinkedList.Node(2);
PalindromeSinglyLinkedList.Node node3 = new PalindromeSinglyLinkedList.Node(2);
node1.next = node2;
node2.next = node3;
assertFalse(PalindromeSinglyLinkedList.isPalindromeOptimised(node1));
}

@Test
public void testOptimisedWithEvenLengthNegative() {
PalindromeSinglyLinkedList.Node node1 = new PalindromeSinglyLinkedList.Node(10);
PalindromeSinglyLinkedList.Node node2 = new PalindromeSinglyLinkedList.Node(20);
PalindromeSinglyLinkedList.Node node3 = new PalindromeSinglyLinkedList.Node(20);
PalindromeSinglyLinkedList.Node node4 = new PalindromeSinglyLinkedList.Node(20);
node1.next = node2;
node2.next = node3;
node3.next = node4;
assertFalse(PalindromeSinglyLinkedList.isPalindromeOptimised(node1));
}
}