Printing my linked list in reverse order in C++

£可爱£侵袭症+ 提交于 2019-12-01 16:57:57

Within printList, you have to also check for head == NULL, otherwise you are acessing members of a pointer pointing to NULL. The following should work.

    void printList()
    {
        node *temp = head;
        while(temp != NULL) // don't access ->next
        {
            cout << temp->data << endl;
            temp = temp->next;
        }
    }

In printReverse() I really can't understand why you take half of the counts of the elements to print and print two elements in every iteration. However, you really don't need a for-loop here. You can simply stop as soon as temp == head after your loop, since then you just printed the head. And only print one element, the one whose next pointer points to the previously printed element.

Another, recursive, attempt to solve the problem looks like this:

    void printReverse()
    {
        printReverseRecursive(head);
    }
    void printReverseRecursive(node *n)
    {
        if(n) {
            printReverseRecursive(n->next);
            cout << n->data << endl;
        }
    }
void printReverse()
{
    printReverse(head) //kickstart the overload function below
}
void printReverse(node *n)
{
    if(n == 0) return;
    printReverse(n->next);   //print the next
    cout << n->data << endl; //before printing me
}

You should consider re-writing your loop to start at the last element (as you have done) and have your loop condition stop when you reach the head. Having double the code inside your for loop, along with the odd count/2 logic is certainly confusing you (and us).

temp = [last element]

while not at head
    print temp
    temp = previous element

print head

Note that you already have the code for the temp = previous element part:

temp2 = head;
while(temp2->next != temp)
    temp2 = temp2->next;

Since I assume this is an assignment of some type, I'm intentionally not giving you the c++ code for this. Even if it isn't assignment, working through it with this in mind should be the learning experience you're after. However, if you give it a shot and still have a problem, feel free to update your question (or post a new one).

for(double count = countItems() / 2; count != 0; --count)
            {
                //Set temp2 before temp
                temp2 = head;
                while(temp2->next != temp)
                    temp2 = temp2->next;
                cout << temp2->data<< "   " << endl;

                //Set temp before temp2
                temp = head;
                while(temp->next != temp2)
                    temp = temp->next;
                cout << temp->data << "   "<< endl;
            }
            cout << "EXIT LOOP" << endl;

Your program crashes because of the second loop. Hint: Go through it with only two elements added to the list, e.g."Hello" -> "You" -> NULL. And look closer to your loop-predicate (temp->next != temp2).

void ReversePrint(Node *head) {

Node *curNode=head;

if(curNode!=NULL){

    if(curNode->next!=NULL){
        ReversePrint(curNode->next);
    }

    cout<<curNode->data<<endl;

}

}

print statement should be in this manner:

void print() {
    node *temp;
    temp= head;
    while (temp != NULL) {
        cout << temp->data << " ";
        temp = temp->next;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!