2015-11-05 186 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

對不起,忘了這個。但總體思路是有效的 –