algorithm - 间接寻址在此代码中如何工作?

标签 algorithm c linked-list

我正在阅读 Merging two sorted linked list 的答案. 代码:

#define SWAP_PTRS(a, b) do { void *t = (a); (a) = (b); (b) = t; } while (0)

Node* MergeLists(Node* list1, Node* list2) 
{
  Node *list = NULL, **pnext = &list;

  if (list2 == NULL)
    return list1;

  while (list1 != NULL)
  {
    if (list1->data > list2->data)
      SWAP_PTRS(list1, list2);

   // What does the following piece of code do ?
    *pnext = list1;  // ??
    pnext = &list1->next; // ??
    list1 = *pnext;     // ?? 
  }

  *pnext = list2;
  return list;
}

我不明白双指针在这里是如何工作的,值是如何改变的?

最佳答案

pnext 是指向 Node 指针的指针,用于保存最后一个节点的 next 字段的地址

所以第一行设置指向下一个节点的指针(列表或前一个node->next)

第二行将pnext设置为当前节点的next字段

第三行在使用刚刚分配的 pnext 处理 list1 的头部之后推进 list1 进行微优化,避免再次取消引用 list1

也可以按照node->next来写:

#define SWAP_PTRS(a, b) do { void *t = (a); (a) = (b); (b) = t; } while (0)

Node* MergeLists(Node* list1, Node* list2) 
{
  Node *list = NULL, *node ;

  if (list2 == NULL)
    return list1;

  if (list1->data > list2->data)
    SWAP_PTRS(list1, list2);

  node=list=list1;

  list1=list1->next;

  while (list1 != NULL)
  {
    if (list1->data > list2->data)
      SWAP_PTRS(list1, list2);

    node->next = list1;  

    node = list1->next; 
    list1 = list1->next;     
  }

  node->next = list2;
  return list;
}

关于algorithm - 间接寻址在此代码中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16924142/

相关文章:

algorithm - 在循环 block 中包含循环的 else block 的复杂性

c - 当 i 是全局变量时, "int i = 10;"和 "int i; i=10;"执行不同的功能吗?

c++ - 链表程序在代码块调试器下挂起,但在其他情况下正常执行

c - 使用已排序的子部分对多个链表进行排序和合并

c++ - 无法将术语添加到列出的列表类

algorithm - 如何加速 geopandas 空间连接?

python合并未排序列表——算法分析

c - Spectre 警告 MSVC C5040 的解决方法

algorithm - 维护数字的数据结构

c - 如何从 C 中的 IPv4 地址获取主机名?