删除链表的最后一个节点,并将其添加到另一个链表

切维

我试图弄清楚如何操作链表。我想删除给定链表的结束节点并将其添加到另一个给定链表的末尾。

出于某种原因,我无法正确地指出我的指针,好吧——至少我认为问题出在哪里。

(此方法位于 while 循环中,因此一个列表不断变小,而另一个列表不断增长。)

void movenode(struct Node **cards,struct Node **column)
{
    struct Node *head = NULL;
    struct Node *tmp,*head1 = *cards;
    struct Node *tmp2,*head2 = *column;

    if (*cards == NULL || (*cards)->next == NULL){
        return;
    }
    while (tmp->next != NULL) {
        head->next = tmp;
        tmp = tmp->next;
    }
    while (tmp2->next != NULL) {
        tmp2 = tmp2->next;
    }
    head->next = NULL;
    tmp2->data = tmp;
    tmp2->next = NULL;


    *cards = head1;
    *column = head2;
}

希望有人能够帮助我更好地理解这一点。

布伦丹

出于某种原因,我无法正确指出我的指针,嗯.. 至少这是我认为问题所在。

你是对的,但它不止于此。例如,在struct Node *head = NULL;没有修改 中的值之后head,因此每次您都head->next在“NULL + 一个小偏移量”处访问内存(并且可能会崩溃)。

要从单链表中删除最后一个条目,您必须找到最后一个条目之前的条目(以便您可以修改它next);并且要将条目添加到链接列表中,您必须找到最后一个条目(以便您可以修改其next)。考虑到这一点,我们可以将其分为 5 个部分:

  • 进行完整性检查

  • *cards查找列表中最后一个条目之前的条目

  • 删除列表中的最后一个*cards条目

  • 查找列表中的最后一个*column条目

  • 将(删除的)条目添加到*columns列表的末尾

您可以一次实现这 5 个部分中的每一个(并对其进行测试)。这是编程的一个重要部分——将更复杂的东西分解成更简单的东西。

生成的代码可能类似于(未经测试):

void movenode(struct Node **cards,struct Node **column) {
    struct Node *temp = *cards;
    struct Node *removed;

    // Do sanity checks

    if (temp == NULL) {
        return;
    }

    // Find the entry before the last entry in the `*cards` list

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

    // Remove the last entry in the `*cards` list

    if(temp == NULL) {
        // The last entry was the first entry
        removed = temp;
        *cards = NULL;
    } else {
        removed = temp->next;
        temp->next = NULL;
    }

    // Find the last entry in the `*column` list

    temp = *column;
    if(temp != NULL) {
        while(temp->next != NULL) {
            temp = temp->next;
        }
    }

    // Add the (removed) entry to the end of the `*columns` list       

    if(temp == NULL) {
        // There was no last entry (list was empty)
        *column = removed;
    } else {
        temp->next = removed;
    }
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何删除数组中元素的最后一个字符并将其添加到另一个元素的开头?

如何创建一个函数,从一个 QTreeWidget 中删除一个项目并将其添加到另一个?

Pinescript - 获取一个系列的最后一个元素并将其添加到另一个系列

从一个 recyclerview 中删除一个项目并将其添加到另一个

创建一个链表,每个节点指向另一个链表

删除链表中的最后一个节点

从链表C#中删除最后一个节点

删除单个链表的最后一个节点

React钩子从数组中删除项目并将其添加到另一个数组

Python:如何连续删除列表的最小值并将其添加到另一个列表?

从方法创建另一个类的实例并将其输出添加到地图

从文件读取行并将其添加到另一个SHELL

在数组中查找元素并将其添加到另一个javascript

Django:从模型上获取ID并将其添加到另一个

Symfony 如何创建一个实体并将其添加到另一个?

删除一个类,然后将其重新添加到另一个显示中

如何从双向链表中删除第一个和最后一个节点?

AngularJS指令,可在单击时添加类,但如果单击,则将其删除并将其添加到另一个元素中

为什么将节点添加到双向链表会删除除第一个节点以外的所有节点?

将一个双循环链表附加到另一个双循环链表的末尾(Python)

ArrayList add() 方法不起作用。无法添加另一个值并将其添加到 jTable

从所有按钮中删除活动类并将其添加到反应中单击的最后一个按钮

为什么一个链表的末端节点从 NULL 变为另一个链表的下一个节点?

将long转换为byte数组并将其添加到另一个数组

从另一个表单获取隐藏的表单数据并将其添加到ajax

将项目添加到ListBox并将其绑定到另一个Listbox中的项目

如何对“透视表”列的值求和并将其添加到另一个“透视表”列中

从 for 循环中获取结果并将其添加到每次迭代的另一个变量中

获取用户输入并将其添加到阵列VBA的最后一个索引