如何仅使用一个变量跟踪链表中的所有节点?

How to keep track of all nodes in a linkedlist using only one variable?

程序将在 while 循环中反复读取用户输入的值。每次读取该值时,都会使用该整数值创建一个新节点。现在我将使用这些创建的节点创建一个 LinkedList。然后打印出存储在 LinkedList 中的每个值。我希望读入的顺序和打印出的顺序是相反的。以下是我的主要功能,其中 readline 只是一个打印消息和读取输入的函数,make_new_node 是一个接受值并使用该值创建新节点的函数,printlink 是打印输出的函数链表中每个节点保存的所有值,freelink包含free函数。现在,我只得到最后一个输入整数的打印结果。只有一个节点变量n,我怎么可能打印出链表中每个节点的所有值成员?

int main()
{
    char buf[100];
    int num;
    Node* n = NULL;

    while(1) {
        readline("The num to put in?: ", buf, sizeof(buf));
        sscanf(buf, "%d", &num);
        if(num == -1) {
            n -> next = NULL;
            printlink(n);
            freelink(n);    
            break;      
        } else {
            n = make_new_node(num);
            n -> next = n;      
        }               
    }

    return 0;
}

存储对第一个节点的引用。由于您从不在此节点之前添加任何节点,因此您可以只使用一种方法来获取第一个节点并通过下一个节点遍历列表。

或者,您可以创建一个双向链表,其中有一个 next 和一个 previous 变量。然后,您的方法可以通过返回 previous.

找到第一个节点

这通常是您处理此问题的方式,但我想这违反了您关于仅使用单个节点指针的规则?这是在允许您解决问题的方式中指定的限制,还是只是您 运行 根据您的实施而加入的限制?

int main()
{
    char buf[100];
    int num;
    Node *head = NULL, *n;
    while(1){
        readline("The num to put in?: ", buf, sizeof(buf));
        sscanf(buf, "%d", &num);
        if (num == -1){
            printlink(n);
            freelink(n);    
            break;      
        } else{
            n = make_new_node(num);
            n -> next = head;
            head = n;     
        }               
    }
    return 0;
}

最常见的方式是将make_new_node的签名改为

Node * make_new_node(int new_value, Node *current_head);

代码则变为:

    } else {
        n = make_new_node(num, n);
    }               

经典的堆栈实现例如

Node * make_new_node(int new_value, Node *current_head) {
    Node *n = malloc(*Node);
    n->value = new_value;
    n-> next = current_head;
    return n;
}

但在那种情况下,这个

    if(num == -1) {
        n -> next = NULL; // NO!

会立即将(堆栈)链表集中到一个元素,所有其他元素都会被泄露...