I was reading the answer to Merging two sorted linked list. The code:
#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;
}
I am not able to understand how the double pointer is working here, how the values are changed ?
pnext is a pointer to a pointer of Node and is meant to hold the address of the
next
field of the last nodeso the first line sets the pointer to the next node (either list or the previous
node->next
)the second line sets pnext to the
next
field of the current nodethe third line advances list1 after just dealing with the head of it using the just assigned pnext for a micro-optimization that avoids dereferencing list1 again
you can also write it in terms of node->next: