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][1]-->[0] ; head=[0][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)
欢迎留言提问等。