A singly linked list with reverse…
In (not particularly beautiful) C++, both recursive and non-recursive reverse methods:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #include <iostream> using namespace std; class ListItem { public : ListItem() : next(NULL) {} char data[100]; ListItem *next; void reverse(ListItem *p) { if (next == NULL) { next = p; } else { next->reverse( this ); next = p; } } }; class LinkedList { public : LinkedList() {} ListItem *start; ListItem *end; ListItem *push_back( char *data) { ListItem *i = new ListItem(); if (end != NULL) { end->next = i; } else { start = i; } for ( size_t n=0;n<100;n++) {i->data[n] = data[n];} end = i; return i; } void reverse() { start->reverse(NULL); ListItem *temp = end; end = start; start = temp; } void reverse_nonrec() { ListItem *last=NULL; for (ListItem *p=start;p!=NULL;) { ListItem *next = p->next; p->next = last; last = p; p = next; } ListItem *temp = end; end = start; start = temp; } void dump() { for (ListItem *p=start;p!=NULL;p=p->next) { cout << "data: " << p->data << endl; } } ~LinkedList() { ListItem *op = NULL; for (ListItem *p=start;p!=NULL;p=p->next) { if (op != NULL) delete op; op = p; } if (op != NULL) delete op; } }; int main() { LinkedList mylist; char tempdata[100]; for ( size_t n=0;n<100;n++) { tempdata[n] = 'A' ; } tempdata[99] = 0; for ( size_t n=0;n<20;n++) { mylist.push_back(tempdata); for ( size_t n=0;n<99;n++) { tempdata[n]++; } } mylist.dump(); mylist.reverse(); cout << "Reversed List" << endl; mylist.dump(); cout << "Reverse again" << endl; mylist.reverse_nonrec(); mylist.dump(); } |