Files
algorithms/list.cpp
Aryadev Chavali 36d5eb111a (list)+recursive reverse algorithm for singly linked lists
Pretty simple, returns the last node as that's the new root node.
Uses default parameters to make sure the first node has next set to null.
2021-11-21 00:28:23 +00:00

77 lines
1.3 KiB
C++

/* list.cpp
* Date: 2021-11-20
* Author: Aryadev Chavali
*/
#include <cstdio>
#include <iostream>
#include <cstdlib>
template <typename T>
struct List
{
T value;
struct List<T> *next;
~List()
{
if (next == NULL)
return;
delete next;
}
};
template <typename T>
List<T> *append(List<T> *lst, T value)
{
List<T> *node;
if (lst == NULL)
{
node = new List<T>;
node->value = value;
node->next = NULL;
return node;
}
for (node = lst; node->next != NULL; node = node->next)
continue;
node->next = new List<T>;
node->next->value = value;
node->next->next = NULL;
return lst;
}
/** Reverse a list
*/
template <typename T>
List<T> *reverse(List<T> *lst, List<T> *prev = NULL)
{
auto next = lst->next;
lst->next = prev;
if (next == NULL)
return lst;
return reverse(next, lst);
}
template <typename T>
std::ostream& operator<<(std::ostream& ostream, const List<T> *lst)
{
if (!lst)
return ostream;
ostream << "|" << lst->value << lst->next;
return ostream;
}
int main(void)
{
auto lst = append<int>(NULL, 1);
for (int i = 2; i < 10; ++i)
lst = append(lst, i);
std::cout << lst << std::endl;
lst = reverse(lst);
std::cout << lst << std::endl;
delete lst;
return 0;
}