正在链接列表前面添加节点

Adding node in front of linklist

本文关键字:添加 节点 前面 列表 链接      更新时间:2023-10-16

我已经实现了如下链接列表,

struct node
{
    int data;
    node* next;
};
void initNode(node* head, int data)
{
    head->data = data;
    head->next = NULL;
}
void addNode(node* linkList, int data)
{
    node* newnode = new node;
    newnode->data = data;
    newnode->next = NULL;
    while (linkList)
    {
        if (linkList->next == NULL)
        {
            linkList->next = newnode;
            return;
        }
        linkList = linkList->next;
    }
}
void insertFrontNode(node* linkList, int data)
{
    node* newnode = new node;
    newnode->data = data;
    newnode->next = linkList;
    linkList = newnode;
}
void DisplayLinkList(struct node* linkList)
{
    int i = 1;
    while (linkList)
    {
        cout << "Linklist(" << i << ") " << linkList->data << endl;
        linkList = linkList->next;
        i++;
    }
}

int main()
{
    node* linkList  =new node;
    initNode(linkList, 5);
    addNode(linkList, 10);
    addNode(linkList, 30);
    insertFrontNode(linkList, 12);  
    DisplayLinkList(linkList);

    cin.get();
    return 0;
}

我的问题是,当我在initNode中初始化链表或在addNode中添加节点时,这些变化反映在我通过参数传递的linkst指针中。但是,如果我在insertFrontNode中添加node-infront,则更改不会反映在链表指针中。

为什么?区别在哪里?

您可能会发现,在列表周围添加一个列表(slist,单链表)结构会有所帮助(并进行头添加和尾添加O(1)操作)。

struct node
{
    int data;
    node* next;
};
struct slist
{
    node* head;
    node* tail;
};
void addHead(slist* linkList, int data)
{
    //new list node
    node* newnode = new node;
    newnode->data = data;
    newnode->next = NULL;
    newnode->next = linkList->head;
    linklist->head = newnode->next;
}
void addTail(slist* list, int data)
{
    //new list node
    node* newnode = new node;
    newnode->data = data;
    newnode->next = NULL;
    if( list->tail ) {
        list->tail->next = newnode;
    }
    list->tail = newnode;
}
void DisplayLinkList(struct slist* linkList)
{
    int i = 1;
    node* link = linklist->head;
    while (link)
    {
        cout << "Linklist(" << i << ") " << link->data << endl;
        link = link->next;
        i++;
    }
}
int main()
{
    slist* linkList=new slist;
    addTail(linkList, 5);
    addTail(linkList, 10);
    addTail(linkList, 30);
    addHead(linkList, 12);  
    DisplayLinkList(linkList);
    return 0;
}

你做得很好。您正在修改链接列表的标题,但没有将其更新到外部世界。因此,当您调用DisplayLinkList时,它是用旧的头指针调用的,这就是为什么更改没有反映出来的原因。检查以下代码:

void insertFrontNode(node** linkList, int data)
{
    node* newnode = new node;
    newnode->data = data;
    newnode->next = *linkList;
    *linkList = newnode;
}
int main()
{
    node* linkList = new node;
    initNode(linkList, 5);
    addNode(linkList, 10);
    addNode(linkList, 30);
    insertFrontNode(&linkList, 12);
    DisplayLinkList(linkList);

    cin.get();
    return 0;
}

在上面的代码中,不仅在前面添加了节点,还更新了头部指针,以便显示函数获得新的更新的头部指针。