单链表 - push_back

时间:2015-02-04 21:34:31

标签: c list linked-list singly-linked-list

我必须创建方法push_back,它会在我的列表末尾添加一个项目。 但我有一个约束 - 我无法检查head是否为空(如果head为null) 我不知道如何做到这一点。这是我的代码:

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int value;
    struct node* next;
};


void print(struct node* head)
{
    struct node* iterator = head;

    while (iterator != NULL)
    {
        printf("%d\n", iterator->value);
        iterator = iterator->next;
    }
    printf("\n");
}

void pushBack(struct node** head, int value)
{
    struct node* element = (struct node*)malloc(sizeof(struct node));
    struct node* iterator = *head;

    element->value = value;
    element->next = NULL;

    if (iterator == NULL) //can't!
    {
        *head = element;
        return;
    }

    while (iterator->next != NULL)
    {
        iterator = iterator->next;
    }

    iterator->next = element;
}

int main(void)
{
    struct node* head = NULL;

    pushBack(&head, 4);
    pushBack(&head, 5);
    pushBack(&head, 52);
    pushBack(&head, 1);

    print(head);
    return 0;
}

任何想法如何在不检查头部和没有空节点的情况下获得工作push_back方法? 我的老师在课后问我们在哪里讨论链表,如果有可能这样做 - 没有人知道怎么做。

4 个答案:

答案 0 :(得分:2)

我想你可能误解了教练的意愿。我相信教练希望你不要检查if (head);而是检查if (*head)。他们相同的条件。

在您的代码中,head是指向指针的指针。虽然你可能迂腐地希望检查某人没有向你传递一个指向指针的空指针,但事实是你真正关心的是 it 指向的指针是否为空(因此取消引用)。

这大大减少了你的代码血统。

void pushBack(struct node** head, int value)
{
    while (*head)
        head = &(*head)->next;

    *head = malloc(sizeof(**head));
    (*head)->value = value;
    (*head)->next = NULL;
}

答案 1 :(得分:1)

是的,你当然可以这样做。这是一个非常好用于指针指针。您甚至可以像这样使用pushBack()

pushBack(&(element->next), 4);

如果element是指向最后一个元素的指针!

如果从pushBack返回新元素,则可以在常量时间O(1)中添加新元素,因为您不必迭代所有先前的元素。

答案 2 :(得分:0)

如果head指向列表中的最后一个元素,那么你只需说

newItem->next = head; 
head = newItem;

当然,这种操作通常被称为“推”。我没有听到过“推回”一词。

答案 3 :(得分:0)

这听起来像是一个数据结构类问题。答案应该在阅读作业中。

但无论如何。我相信答案是使用循环链表。这是什么,是指向空节点的头指针。空节点标记列表的开头和结尾。这样做可以简化所有列表操作,因为它完全不需要对头指针进行操作。