按顺序遍历单个链表

Sar*_*aya 2 c++ traversal linked-list singly-linked-list

我一直在尝试想一种遍历单个链表的方法。

到目前为止,这是我所做的:

#include <iostream>

typedef struct node {                                                               
      int data;               // will store information
      node *next;             // the reference to the next node
};  


int printList(node *traverse) {
    if (traverse->next == NULL) {
        return -1;
    }
    traverse=traverse->next;
    printList(traverse);
    cout << traverse->data << endl;
    return 0;
}

int main() {
    node *head = NULL;      
    for (int i = 0; i < 10; i++) {
        node *newEntry = new node;
        newEntry->data = i;
        newEntry->next = head;
        head = newEntry;
    }
    printList(head);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想不出一种方法来打印printList()函数中的最后一位数字(9)。我怎样才能实现这一目标?我的第二个问题是,如何在 while 循环而不是递归函数中遍历相同的内容。

正如你们中的一些人之前尝试回答的那样,我不想从 9 到 0 遍历它,这应该从 0 到 9 遍历,您可以看到http://codepad.org/ynEdGc9S的输出

小智 6

这里有一些事情:


您创建列表的方式main()不正确。画出你正在做的事情,你会发现你的项目是列表中的最后一项,即它的值可能是 9。(在调用 printList 来验证这一点之前打印出 head 的值)。head

让我解释一下(按照您的代码)迭代 i = 1:

当前状态:head=[0]

  1. 分配一个新的临时节点 [ ]
  2. 然后你给它分配数据[1]
  3. 然后你把这个临时节点设置在你的头旁边[1]-->[0] ; head=[0]
  4. 然后你将 head 设置为这个临时节点[1]-->[0] ; head = [1]

所以,你可以看到这里发生了什么。头应该是静止的[0],而它的下一个应该是,[1]而不是相反。

你可以探索并思考正确的做法。


printList,这是打印出递归堆栈而不是遍历。遍历会以相反的顺序打印它们,因为您的列表是相反的顺序(请检查上一节 ^ 了解原因)。

这是在遍历中打印链接的正确方法。这将按原样打印列表的元素。 当您检查 traverse->next==NULL 时,traverse 保存了最后一个元素。由于您刚刚通过返回 -1 结束了递归,因此最后一个元素从未被打印。

int printList(node *traverse) {
   if (traverse == NULL) {  
       return -1;
    }
    cout << traverse->data << endl;
    printList(traverse->next);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

迭代

int printList(node *traverse) {
   while(traverse != NULL) {  
    cout << traverse->data << endl;
    traverse = traverse->next;
   }
}
Run Code Online (Sandbox Code Playgroud)

欢迎留言提问等。