Python Program For Finding The Length Of Longest Palindrome List In A Linked List Using O(1) Extra Space

18 Apr, 2022
Given a linked list, find the length of the longest palindrome list that exists in that linked list. Examples:  
Input  : List = 2->3->7->3->2->12->24
Output : 5
The longest palindrome list is 2->3->7->3->2

Input  : List = 12->4->4->3->14
Output : 2
The longest palindrome list is 4->4
 
A simple solution could be to copy linked list content to array and then find the longest palindromic subarray in the array, but this solution is not allowed as it requires extra space.The idea is based on iterative linked list reverse process. We iterate through the given a linked list and one by one reverse every prefix of the linked list from the left. After reversing a prefix, we find the longest common list beginning from reversed prefix and the list after the reversed prefix. Below is the implementation of the above idea. 
Python
# Python program to find longest palindrome# sublist in a list in O(1) time. # Linked List nodeclass Node:    def __init__(self, data):        self.data = data        self.next = None # function for counting the common elementsdef countCommon(a, b) :     count = 0     # loop to count common in the list starting    # from node a and b    while ( a != None and b != None ) :         # increment the count for same values        if (a.data == b.data) :            count = count + 1        else:            break                 a = a.next        b = b.next     return count # Returns length of the longest palindrome# sublist in given listdef maxPalindrome(head) :     result = 0    prev = None    curr = head     # loop till the end of the linked list    while (curr != None) :             # The sublist from head to current        # reversed.        next = curr.next        curr.next = prev         # check for odd length        # palindrome by finding        # longest common list elements        # beginning from prev and        # from next (We exclude curr)        result = max(result,                    2 * countCommon(prev, next) + 1)         # check for even length palindrome        # by finding longest common list elements        # beginning from curr and from next        result = max(result,                    2 * countCommon(curr, next))         # update prev and curr for next iteration        prev = curr        curr = next         return result # Utility function to create a new list nodedef newNode(key) :     temp = Node(0)    temp.data = key    temp.next = None    return temp # Driver code # Let us create a linked lists to test# the functions# Created list is a: 2->4->3->4->2->15head = newNode(2)head.next = newNode(4)head.next.next = newNode(3)head.next.next.next = newNode(4)head.next.next.next.next = newNode(2)head.next.next.next.next.next = newNode(15) print(maxPalindrome(head)) # This code is contributed by Arnab Kundu
Output : 
5
Time Complexity : O(n2)Note that the above code modifies the given linked list and may not work if modifications to the linked list are not allowed. However, we can finally do one more reverse to get an original list back. Please refer complete article on Length of longest palindrome list in a linked list using O(1) extra space for more details!
sumitgumber28
Accolite
Microsoft
palindrome
Linked List
Python Programs
Accolite
Microsoft
Linked List
palindrome
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.