当前位置: 首页 > 知识库问答 >
问题:

在与头部连接的双向链表中删除

易成双
2023-03-14

我有两个循环双链表,与head和integer元素(无序)相连。要删除的第一个列表中包含第二个列表中的值。你的工作怎么样?如何排除这种情况?需要搜索第一个列表中的值才能删除第二个列表?我怎样才能和他们合作?你能解释一下解决这个问题的算法吗?

例如:

我有两个循环的双链表,带有head。

L1:40100902003266

L2:60146308090

我想删除第一个列表中第二个列表中的值。第一个列表将是:

L1:40100266

我想知道如何使用列表的指针来进行这种排除。我想要伪代码中的一个概念。我已经用C语言创建了代码,但我不明白算法。我需要理解之前如何做。

共有1个答案

双浩涆
2023-03-14

从编写算法的伪代码开始,然后实现实际功能,可以独立测试。

一般的伪代码是这样的:

for each node in list1
{
    if (list2 contains node) 
    {
       remove node from list1
    }
}

假设列表和节点的定义如下:

struct Node 
{
    struct Node *next;
    struct Node *prev;
    int number;
}

struct List
{
    struct Node *head;
}

// these should be instantiated somewhere
struct List* list1;
struct List* list2;

所以,函数的骨架应该是这样的:

struct Node* node = list1->head;

while (node != null)
{
    // prepare the next node early
    struct Node* next = node->next;

    // check if list2 contains a matching node
    if (match(list2, node->number)) 
    {
        // remove the node properly,
        // updating whatever you need to update
        remove(list1, node);
    }

    // if it's circular, check if this
    // is the last node
    if (next == list1->head)
        break;

    node = next;
}

因此,现在只剩下实现两个函数:

// returns true if any node in list contains the specified number
bool match(struct List* list, int number);

// removes the node from the list
void remove(struct List* list, struct Node* node);
 类似资料:
  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 主要内容:双向链表的创建目前我们所学到的 链表,无论是动态链表还是 静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为 单向链表(或 单链表)。 虽然使用单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后"

  • 双向链表 结构体 struct   rt_list_node   双向链表节点 更多...   宏定义 #define  rt_container_of(ptr, type, member)   ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))   获取type结构体中member成员在这个结构体中的偏移   #de

  • 双向链表 Linux 内核自己实现了双向链表,可以在 include/linux/list.h 找到定义。我们将会从双向链表数据结构开始内核的数据结构。为什么?因为它在内核里使用的很广泛,你只需要在 free-electrons.com 检索一下就知道了。 首先让我们看一下在 include/linux/types.h 里的主结构体: struct list_head { struct l

  • 我用C语言编写了双重链接列表的代码,它从头到尾的遍历很好,但从尾(end)到头的遍历陷入了无限循环,只打印最后一个节点的数据,我不知道出了什么问题。

  • 我有一个头和lastNode的参考。嗨我有个问题。当我删除双向链表中的最后一个节点时,我必须将该节点的前一个引用设置为空,或者我可以离开它。我在删除lastNode时做了这样的事情。 当我使用toString方法时,它会按预期打印。只是想知道是否有必要将旧的last node prev设置为null。或者垃圾收集器只是删除它,因为没有对它的引用,即使旧节点仍然有对链接列表中某个节点的引用