The following code creates a linked list with 20 random elements, and then reverses the list.

/*
reverse-linked-list.cpp
Jason B. Hill (jason@jasonbhill.com)
reverse a linked list in C++
*/
 
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
// Node class
class Node {
 
    public:
    int         data;
    Node*       next;
 
    // create a new node
    Node(int x, Node* addr) {
        data = x;
        next = addr;
    }
};
 
// LinkedList class
class LinkedList {
    private:
    Node*       head;
 
    public:
 
    // initialize a linked list with a NULL head
    LinkedList() {
        head = NULL;
    }
 
    // determine if a list is empty
    bool is_empty() {
        if(head == NULL) return 1;
        else return 0;
    }
 
    // add an item to a linked list
    void node_add(int val) {
        if(head == NULL) head = new Node(val, NULL);
        else {
            Node* n = head;
            while(n->next != NULL) n = n->next;
            n->next = new Node(val, NULL);
        }
    }
 
    // return the length of a linked list
    unsigned int length() {
        if(head == NULL) return 0;
        if(head->next == NULL) return 1;
        unsigned int len = 1;
        Node* n = head;
        while(n->next != NULL) {
            n = n->next;
            len++;
        }
        return len;
    }
 
    // print a linked list
    void print() {
        cout<<"[";
        if(head != NULL) {
            if(head->next == NULL) cout<<head->data;
            else {
                Node* n = head;
                while(n->next != NULL) {
                    cout<<n->data<<",";
                    n = n->next;
                }
                cout<<n->data;
            }
        }
        cout<<"]\n";
    }
 
    //reverse a linked list
    void reverse() {
        if(head != NULL and head->next != NULL) {
            Node* m = head;
            Node* n = head->next;
            Node* t = NULL;
            if(n->next != NULL) t = n->next;
            head->next = NULL;
            while(t->next != NULL) {
                n->next = m;
                m = n;
                n = t;
                t = t->next;
            }
            n->next = m;
            head = t;
            t->next = n;
        }
    }
};
 
int main(void){
 
    LinkedList      L;
    unsigned int    i;
 
    srand(time(NULL)); 
    for(i=0;i<20;i++) L.node_add(rand() % 100);
 
    L.print();
 
    L.reverse();
 
    L.print();
 
 
    return(0);
}

This can be compiled (using gcc/g++) using:

g++ reverse-linked-list.cpp -o reverse-linked-list

An example execution is:

$ ./reverse-linked-list 
[99,31,17,41,7,38,59,7,67,75,75,13,62,70,0,20,46,3,14,24]
[24,14,3,46,20,0,70,62,13,75,75,67,7,59,38,7,41,17,31,99]
Posted in C++

It took me a while to figure out how to properly include solutions inside a WeBWorK problem. I’m recording this here for future reference. I’m modifying a problem from the National Problem Library here. I’ve restated the problem slightly and have included the solution, to match the format of the other questions we ask students on our WeBWorK system.

Code:

## DESCRIPTION
##  Calculus
## ENDDESCRIPTION
## KEYWORDS('Calculus','Derivatives')
 
## DBsubject('Calculus')
## DBchapter('Differentiation')
## DBsection('Related Rates')
## Date('')
## Author('')
## Institution('')
## TitleText1('')
## EditionText1('')
## AuthorText1('')
## Section1('')
## Problem1('')
DOCUMENT();        # This should be the first executable line in the problem.
 
loadMacros(
"PG.pl",
"PGbasicmacros.pl",
"PGchoicemacros.pl",
"PGanswermacros.pl",
"PGauxiliaryFunctions.pl"
);
TEXT(beginproblem());
$showPartialCorrectAnswers = 1;
 
$a1 = random(2,5,1);
$r1 = random(1,5,1);
$deriv1 = 2*3.14159265*$r1*$a1;
TEXT(EV2(<<EOT));
Let \(A\)  be the area of a circle with radius \(r\). If
\( \displaystyle \frac { dr }{ dt } = $a1 \), find
\( \displaystyle \frac { dA }{ dt }  \) when \( r = $r1 \).
$BR
You may write the exact answer (use "pi" for \(\pi\)) or an approximation 
accurate to within 2 decimal places.
$BR
$BR
\(\displaystyle\frac{dA}{dt}=\)\{ans_rule(20) \}
EOT
 
$ans = $deriv1;
$prod = 2*$r1*$a1;
ANS(num_cmp($ans));
SOLUTION(EV3(<<'END_SOLUTION'));
 
$PAR SOLUTION $PAR
Viewing \(r\) as a function of \(t\), we have \(A=\pi r^2=\pi(r(t))^2\). 
Hence, the product rule gives us
\[\frac{dA}{dt}=\frac{d}{dt}(\pi r(t)r(t))=2\pi r(t)r'(t)=2\pi r\frac{dr}{dt}.\]
Filling in \(r=$r1\) and \(\displaystyle\frac{dr}{dt}=$a1\) gives
\[\frac{dA}{dt}=2\pi ($r1)($a1)=$prod\pi\approx $ans.\]
 
END_SOLUTION
ENDDOCUMENT();