Let us analyze the following code.
head = new Node;
if(forward)
head->setData(aList.head->getData());
else // copy in reverse.
head->setData(aList.tail->getData());
//copy rest of List.
Node *newPtr = head; //newPtr points to last Node in new List.
Here, you creating an object of Node and assigning it to head. Then you are setting the last or first data of list in head pointer. Then assing newPtr to head. So till now newPtr is pointing to just one element of list.
Next let us analyze following code.
} else {
cout << "Copying in reverse order...\n" << endl;
for(Node *origPtr=aList.tail->getPrev(); origPtr!=NULL;
origPtr=origPtr->getPrev()) {
newPtr = newPtr->getNext();
newPtr->setData(origPtr->getData()); //SEG FAULT
} // end for
Here you are doing
newPtr = newPtr->getNext()
Now, since newPtr is just pointing to one element. After this operation, newPtr becomes null. Now, with newPtr being null, following is bound to crash
newPtr->setData(origPtr->getData()); //SEG FAULT
You must allocate the memory for next element before doing newPtr->getNext().