我一直试图想办法遍历单个链表。
到目前为止,我所做的一切:
#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;
}
我无法想到在printList()
函数中打印最后一位数字(9)的方法。我怎么能做到这一点?
我的第二个问题是,如何在while循环中遍历相同的循环而不是递归函数。
正如你们中的一些人之前尝试回答的那样,我不打算将其从9遍历到0,这应该从0到9遍历,你可以看到http://codepad.org/ynEdGc9S的输出
答案 0 :(得分:3)
这里有一些事情:
以main()
方式创建列表不正确。画出你正在做的事情,你会发现你的head
是列表中的最后一项,也就是说,它的值可能是9.(在调用printList之前打印出head的值来验证这一点)。
让我用i = 1的迭代解释(在你的代码中跟随):
当前状态:head=[0]
[ ]
[1]
[1]-->[0] ; head=[0]
[1]-->[0] ; head = [1]
所以,你可以看到这里发生了什么。头部应该仍然是[0]
,其下一个应该是[1]
而不是相反。
您可以探索并思考这样做的正确方法。
printList,这是打印出递归堆栈而不是遍历。遍历将以相反的顺序打印它们,因为您的列表顺序相反(检查上一节^为什么)。
这是在遍历中打印链接的正确方法。这将按照它们的方式打印列表的元素。 当您检查traverse-&gt; next == NULL时,遍历保持最后一个元素。由于您刚刚以返回-1结束了递归,因此从未打印过最后一个元素。
int printList(node *traverse) {
if (traverse == NULL) {
return -1;
}
cout << traverse->data << endl;
printList(traverse->next);
return 0;
}
迭代
int printList(node *traverse) {
while(traverse != NULL) {
cout << traverse->data << endl;
traverse = traverse->next;
}
}
随意发布问题等。
答案 1 :(得分:1)
而不是if (traverse->next == NULL)
尝试if (traverse == NULL)
这样,如果当前节点是包含数据的实际节点,则打印当前节点。然后你递减。最后,最后你将进入一个NULL
指针,你很容易逃脱。
答案 2 :(得分:0)
为什么不交换这些陈述?
traverse=traverse->next;
printList(traverse);
cout << traverse->data << endl;
这应该改为:
cout << traverse->data << endl;
traverse=traverse->next;
printList(traverse);
这应该有效。然后,改变
if(traverse->next==NULL)
到
if(traverse==NULL)
答案 3 :(得分:0)
作为第二部分的答案,您的代码可能如下所示:
void printList_iter(node* node)
{
while (node)
{
cout << node->data << endl;
node = node->next;
}
}
这将遍历列表,打印每个元素,直到它到达NULL节点,这表示列表的结尾。它是一种非常标准的迭代算法。