2015-11-05 182 views
0

我有这段代码,我从一开始就输入了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; 

} 
+0

你在哪里试图向后打印清单? – NathanOliver

+0

刚刚完成添加元素后,进行验证。 – user3212534

+1

它正在做你编码它做的事情。以'head = null'开头。创建'1',指向'null'(当前头),并更新'head = 1'。之后,添加'3',指向'1'(头部)旁边并更新'head = 3'。加'5',指向'3' ...旁边(5-> 3-> 1-> null)。完成后,从头开始(5)..打印并转到下一个(3)。如果您使用一张纸并逐步说明即将发生的事情,它会有所帮助,它可以帮助您查看正在发生的事情。 – wendelbsilva

回答

1

这样做的一种方法是递归。使用调用堆栈跟踪每个节点,您将不断遍历列表。一旦你到达最后,你打印并结束该功能。然后这将传回备用到下一个元素的调用堆栈。

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

这个例子假设在列表中的最后一个节点是nextNULLnullptr

1

这是您的名单看起来像输入数据的每个步骤后:

  1. 3> 1
  2. 5-> 3> 1
  3. 7-> 5-> 3-> 1
  4. 9-> 7-> 5-> 3-> 1

如果想有列表(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; 
    } 
} 

它应该以这种方式工作。

+0

您正确地追加列表,但您从未将尾部移动到最后一个节点。你将失去第三和第四节点的踪迹。它将最终打印1,3,9。 – alvits

+0

对不起,忘了这个。但总体思路是有效的 –