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
#includehttps://ideone.com/Wj9ocKusing 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; }
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
#includehttps://ideone.com/Lcfc4rusing 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; }
No comments :
Post a Comment