我正在阅读 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/