显示链接列表时反向排序

时间:2015-11-05 21:11:43

标签: c++ linked-list reverse

我有这个代码,我从头开始输入5个随机元素1,3,5,7,9然后我想显示我的链表(1,3,5,7,9),但它是在因某些奇怪的原因而逆序(9,7,5,3,1)。你能指出问题吗?

#include <iostream> using namespace std;

struct node {
    int data;
    node * next; };

int n;

int main() {

    // input.
    cout << "please input 5 elements:\n";
    node * head = NULL;
    for (int i = 0; i < 5; i++) {
        cin >> n;
        node * curr = new node;
        curr -> data = n;
        curr -> next = head;
        head = curr;
    }


    // display
    while (head) {
        cout << head -> data << "\n";
        head = head -> next;
    }

    return 0;

}

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用递归。使用调用堆栈来跟踪每个节点,您将继续遍历列表。一旦到达最后,则打印并结束该功能。然后,这将传播回调用堆栈,打印下一个元素,直到开始。

void print_revers(node* n)
{
    if (n)
        print_reverse(n->next)
    std::cout << n->data << std::endl;
}

此示例假定列表中next指向NULLnullptr

的最后一个节点

答案 1 :(得分:1)

在输入数据的每个步骤之后,这就是你的列表的样子:

  1. 1
  2. 3→1
  3. 5→3→1
  4. 7-&GT; 5→3→1
  5. 9-&将7-&GT; 5→3→1
  6. 如果您想要列表(1,3,5,7,9),则需要在列表末尾插入每个元素,而不是在开头。所以,你需要有一个指向结尾的指针(我认为它被称为尾部),以便按照你想要的顺序放置元素。代码如下所示:

    node * head = NULL, * tail = NULL;
    for (int i = 0; i < 5; i++) {
        cin >> n;
        node * curr = new node;
        curr -> data = n;
        curr -> next = NULL;
        if(head == NULL) {
            head = tail = curr;
        }
        else {
            tail -> next = curr;
            tail = tail -> next;
        }
    }
    

    它应该以这种方式工作。