Given a linked list handling string data, check to see whether data is palindrome or not?
For example,
Input : a -> bc -> d -> dcb -> a -> NULL Output : True String "abcddcba" is palindrome. Output : a -> bc -> d -> ba -> NULL Output : False String "abcdba" is not palindrome.
The idea is very simple. Construct a string out of given linked list and check if the constructed string is palindrome or not.
C++
// Program to check if a given linked list of strings // form a palindrome #include <bits/stdc++.h> using namespace std;
/* Link list node */ struct Node
{ string data;
Node* next;
}; // A utility function to check if str is palindrome // or not bool isPalindromeUtil(string str)
{ int length = str.length();
// Match characters from beginning and
// end.
for ( int i=0; i<length/2; i++)
if (str[i] != str[length-i-1])
return false ;
return true ;
} // Returns true if string formed by linked // list is palindrome bool isPalindrome(Node *node)
{ // Append all nodes to form a string
string str = "" ;
while (node != NULL)
{
str.append(node->data);
node = node->next;
}
// Check if the formed string is palindrome
return isPalindromeUtil(str);
} // A utility function to print a given linked list void printList(Node *node)
{ while (node != NULL)
{
cout << node->data << " -> " ;
node = node->next;
}
printf ( "NULL\n" );
} /* Function to create a new node with given data */ Node *newNode( const char *str)
{ Node *new_node = new Node;
new_node->data = str;
new_node->next = NULL;
return new_node;
} /* Driver program to test above function*/ int main()
{ Node *head = newNode( "a" );
head->next = newNode( "bc" );
head->next->next = newNode( "d" );
head->next->next->next = newNode( "dcb" );
head->next->next->next->next = newNode( "a" );
isPalindrome(head)? printf ( "true\n" ):
printf ( "false\n" );
return 0;
} |
Java
// Java Program to check if a given linked list of strings // form a palindrome import java.util.Scanner;
// Linked List node class Node
{ String data;
Node next;
Node(String d)
{
data = d;
next = null ;
}
} class LinkedList_Palindrome
{ Node head;
// A utility function to check if str is palindrome
// or not
boolean isPalidromeUtil(String str)
{
int length = str.length();
// Match characters from beginning and
// end.
for ( int i= 0 ; i<length/ 2 ; i++)
if (str.charAt(i) != str.charAt(length-i- 1 ))
return false ;
return true ;
}
// Returns true if string formed by linked
// list is palindrome
boolean isPalindrome()
{
Node node = head;
// Append all nodes to form a string
String str = "" ;
while (node != null )
{
str = str.concat(node.data);
node = node.next;
}
// Check if the formed string is palindrome
return isPalidromeUtil(str);
}
/* Driver program to test above function*/
public static void main(String[] args)
{
LinkedList_Palindrome list = new LinkedList_Palindrome();
list.head = new Node( "a" );
list.head.next = new Node( "bc" );
list.head.next.next = new Node( "d" );
list.head.next.next.next = new Node( "dcb" );
list.head.next.next.next.next = new Node( "a" );
System.out.println(list.isPalindrome());
}
} // This code has been contributed by Amit Khandelwal |
Python3
# Python program to check if given linked list of # strings form a palindrome # Node class class Node:
# Constructor to initialize the node object
def __init__( self , data):
self .data = data
self . next = None
class LinkedList:
# Function to initialize head
def __init__( self ):
self .head = None
# A utility function to check if str is palindrome
# or not
def isPalindromeUtil( self , string):
return (string = = string[:: - 1 ])
# Returns true if string formed by linked list is
# palindrome
def isPalindrome( self ):
node = self .head
# Append all nodes to form a string
temp = []
while (node is not None ):
temp.append(node.data)
node = node. next
string = "".join(temp)
return self .isPalindromeUtil(string)
# Utility function to print the linked LinkedList
def printList( self ):
temp = self .head
while (temp):
print (temp.data,end = " " )
temp = temp. next
# Driver program to test above function llist = LinkedList()
llist.head = Node( 'a' )
llist.head. next = Node( 'bc' )
llist.head. next . next = Node( "d" )
llist.head. next . next . next = Node( "dcb" )
llist.head. next . next . next . next = Node( "a" )
print ( "true" if llist.isPalindrome() else "false" )
# This code is contributed by Nikhil Kumar Singh(nickzuck_007) |
C#
// C# Program to check if a given linked list // of strings form a palindrome using System;
// Linked List node class Node
{ public String data;
public Node next;
public Node(String d)
{
data = d;
next = null ;
}
} public class LinkedList_Palindrome
{ Node head;
// A utility function to check if
// str is palindrome or not
bool isPalidromeUtil(String str)
{
int length = str.Length;
// Match characters from beginning and
// end.
for ( int i = 0; i < length / 2; i++)
if (str[i] != str[length - i - 1])
return false ;
return true ;
}
// Returns true if string formed by linked
// list is palindrome
bool isPalindrome()
{
Node node = head;
// Append all nodes to form a string
String str = "" ;
while (node != null )
{
str = str+(node.data);
node = node.next;
}
// Check if the formed string is palindrome
return isPalidromeUtil(str);
}
/* Driver code*/
public static void Main(String[] args)
{
LinkedList_Palindrome list = new LinkedList_Palindrome();
list.head = new Node( "a" );
list.head.next = new Node( "bc" );
list.head.next.next = new Node( "d" );
list.head.next.next.next = new Node( "dcb" );
list.head.next.next.next.next = new Node( "a" );
Console.WriteLine(list.isPalindrome());
}
} // This code has been contributed // by PrinciRaj1992 |
Javascript
<script> // Javascript Program to check if a given linked list of strings // form a palindrome var head;
class Node{ constructor(val){
this .data = val;
this .next = null ;
}
} function isPalindromeUtil(str){
var length = str.length;
// Match characters from beginning and
// end.
for ( var i = 0; i<length/2; i++){
if (str[i] != str[length-i-1])
return false ;
}
return true ;
} // Returns true if string formed by linked // list is palindrome function isPalindrome(node){
// Append all nodes to form a string
var str = "" ;
while (node != null ){
str += node.data;
node = node.next;
}
// Check if the formed string is palindrome
return isPalindromeUtil(str);
} function printList(node)
{ while (node != null )
{
console.log(node.data + " " );
node = node.next;
}
} head = new Node( "a" );
head.next = new Node( "bc" );
head.next.next = new Node( "d" );
head.next.next.next = new Node( "dcb" );
head.next.next.next.next = new Node( "a" );
isPalindrome(head) ? console.log( "true" ) : console.log( "false" );
// This code is contributed by Yash Agarwal(yashagarwal2852002) </script> |
Output
true
Time Complexity: O(n), where n is the number of nodes in the given linked list.
Auxiliary Space: O(m), where m is the length of the string formed by the linked list.