This is working example, I'm interested in mostly in knowing if there is any c++ related improvements you guys suggest? Also, do you think its better to solve this question iteratively or interviewer would prefer some recursive solution (assuming if that is possible)? Any other suggestions from interview point of view welcome?
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
template<typename valT>
struct node
{
valT val;
node<valT> *next;
node() { next = nullptr; }
node(valT v) : val(v),next(nullptr) { }
~node() { next = nullptr; }
};
using myNode = node<int>;
using myNodePtr = myNode *;
myNodePtr head = nullptr;
void showLL(myNodePtr head)
{
std::cout << "Linked List =>";
while(head){
std::cout << head->val << ", ";
head = head->next;
}
std::cout << std::endl;
}
int main(int argc, char **argv)
{
myNodePtr prev = nullptr;
for( int i = 1; i < argc ; i++ ) {
myNodePtr tmp = new myNode(strtol(argv[i], NULL, 10));
if(!head) {
head = tmp;
}
if(prev){
prev->next = tmp;
}
prev = tmp;
}
std::cout << "Input " << std::endl;
showLL(head);
//Find middle
//Push on stack until you find middle
//Stop fast runner and pop back and compare and break if not same
//Palindrome loop
myNodePtr middleNode = nullptr;
std::vector<int> stack;
for(myNodePtr slowRunner = head, fastRunner = head; slowRunner; slowRunner = slowRunner->next) {
if(!middleNode) {
stack.push_back(slowRunner->val);
if(fastRunner->next) {
if(fastRunner->next->next) { //odd
fastRunner = fastRunner->next->next;
if(!fastRunner->next) {
slowRunner = slowRunner->next;
}
} else { //even
fastRunner = fastRunner->next;
}
if(!fastRunner->next) {
middleNode = slowRunner;
std::cout << "middle node =" << slowRunner->val << std::endl;
}
}
} else {
//even odd
if( stack.back() != slowRunner->val) {
std::cout << "Not a palindrom!" << std::endl;
return 1; //delete all linked lists
}
stack.pop_back();
}
}
std::cout << "is Palindrome"<< std::endl;
}
std::list? \$\endgroup\$