Quantcast
Channel: Esdee
Viewing all articles
Browse latest Browse all 31

reverse linked list

$
0
0
been fooling around writing solutions to algorithms in c++.
here is a solution to reverse a linked list. nothing new - the idea is to revert the links, but before that keep somewhere the links to the nodes to come so that this information is not lost during iterating.
shouldn't have any bugs due to corner cases, i hope :D


#include
using namespace std;

struct List {
int value = 0;
List* next = nullptr;
List(int x) : value(x) {}
};

List* reverse(List* head) {
List* next = head->next;
head->next = nullptr;
while (next != nullptr) {
List* movingHead = next->next;
next->next = head;
head = next;
next = movingHead;
}
return head;
}

int main() {
List* head = new List(1);
List* list = head;
for (int index = 2; index < 10; index++) {
List* next = new List(index);
list->next = next;
list = next;
}
head = reverse(head);

while (head != nullptr) {
printf("%d\n", head->value);
head = head->next;
}
return 0;
}
https://ideone.com/Wj9ocK

it seems like often it is easier to come up with a recursive solution. here is one: recursively go the the end of the list and then, on winding back, attach "prior" nodes as "next"s to the new head

#include
using namespace std;

struct List {
int value = 0;
List* next = nullptr;
List(int x) : value(x) {}
};

List* reverse(List* head) {
List* list = head;
List* new_head = list;
if (list->next != nullptr) {
list = reverse(list->next);
new_head = list;
while (list->next != nullptr) {
list = list->next;
}
list->next = head;
head->next = nullptr;
}
return new_head;
}

int main() {
List* head = new List(1);
List* list = head;
for (int index = 2; index < 10; index++) {
List* next = new List(index);
list->next = next;
list = next;
}
head = reverse(head);

while (head != nullptr) {
printf("%d\n", head->value);
head = head->next;
}
return 0;
}
https://ideone.com/Lcfc4r

Viewing all articles
Browse latest Browse all 31

Trending Articles