2013-06-04 87 views
0

我正在閱讀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; 
} 

我無法理解如何雙指針在這裏工作,該值是如何改變?

+0

當您逐步在調試器,看變量的值會發生什麼? – Useless

回答

2

pnext是一個指向節點的指針,其目的是保持最後節點

next場的地址,以便在第一行設置指針到下一個節點(任一列表或以前node->next

第二行設置pnext到當前節點

next場剛剛處理使用一種避免再次解引用list1的微優化的剛分配pnext它的頭部之後的第三線前進list1的

你也可以把它寫在節點 - >下一方面:

#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; 
}