按顺序遍历单个链表

时间:2013-07-03 14:01:10

标签: c++ linked-list traversal 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;
}

我无法想到在printList()函数中打印最后一位数字(9)的方法。我怎么能做到这一点? 我的第二个问题是,如何在while循环中遍历相同的循环而不是递归函数。

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

4 个答案:

答案 0 :(得分:3)

这里有一些事情:


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

让我用i = 1的迭代解释(在你的代码中跟随):

当前状态:head=[0]

  1. 分配了一个新的临时节点[ ]
  2. 然后您为其分配数据[1]
  3. 然后将此临时节点设置在您的头部[1]-->[0] ; head=[0]
  4. 旁边
  5. 然后设置此临时节点[1]-->[0] ; head = [1]
  6. 所以,你可以看到这里发生了什么。头部应该仍然是[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节点,这表示列表的结尾。它是一种非常标准的迭代算法。