在此代码中,间接是如何工作的



我正在阅读合并两个排序链表的答案。代码:

#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)

第二行设置当前节点next字段旁边的p_

第三行在使用刚刚分配的pnext处理了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;
}

相关内容

  • 没有找到相关文章

最新更新