我编写了一种将两个排序的链表(LL升序)合并为一个方法。通过使用双指针,我将头指针的地址从调用函数(主)传递到了被调用函数(mergeSortedLL)。

//definition of listNode
    struct ListNode{
    int data;
    struct ListNode *next;
    };


void mergeSortedLL(struct ListNode **headA,struct ListNode *prevA,struct ListNode **headB,struct ListNode *prevB)
{
    struct ListNode *currA=*headA,*currB=*headB;
    static struct ListNode *finalHead=NULL;


//  Base Condition
if(!currA || !currB)
{

    *headA=finalHead;                     // this should change head in main function
      printList(*headA);                  // LINE-1  this function prints data of linked list sequentially.
    return;
}

    struct ListNode *nextA=currA->next, *nextB=currB->next;

    if(currA->data>currB->data)
    {
        if(!finalHead)
            finalHead=currB;           // finalhead points to head of that LL which starts with smaller value node

        currB->next=currA;
        if(prevB)
            prevB->next=currB;
        mergeSortedLL(&currA,currB,&nextB,currB);
    }

    else
    {
        if(!finalHead)
            finalHead=currA;           //finalhead points to head of that LL which starts with smaller value node

        currA->next=currB;
        if(prevA)
            prevA->next=currA;
        mergeSortedLL(&nextA,currA,&currB,currA);
    }
}


在主要功能中,我创建了两个LL
head ==> -1-> 3-> 5-> 6-> 8-> 9第一个节点是-1
head2 ==> 0-> 1-> 4-> 5-> 7-> 8-> 9
并从主打来

mergeSortedLL(&head,NULL,&head2,NULL);
printList(head);                             //Line-2


我无法预测的是mergeSortedLL函数的Line-1总是打印所需的排序LL,而main中Line-2的printList方法有时需要传递head,有时需要传递head2以获得所需的输出( 0113455678899)。
例如,如果第一个LL更改为head==> 1->3->5->6->8->9,(第一个节点为正1),第2行要求传递head2而不是head以获得所需的o / p。
像在mergeSoretedLL方法中一样,它是如何通过双指针headA发生的,我正在将head(主函数)更改为指向finalHead。
我认为以某种方式交换了headA和headB的值,但是我在这里看不到它。
有人请解释一下。

最佳答案

您需要分配:

*headA=finalHead;


在if and else语句中也是如此,即如下所示:

if(!finalHead) {  // in if case
    finalHead=currB;
    *headA = finalHead;
}

...
...

if(!finalHead) {  // in else case
    finalHead=currA;
    *headA = finalHead;
}


这是因为当您从main调用时,因为* headA和* headB不为NULL,所以currA和CurrB不为NULL。因此,您的代码将输入基于currA->data > currB->data的else语句是否为true。在这里,您可以将finalHead分配给currA或currB,但是这不会反映在* headA(main中的head)中。因此,很明显,当您从main打印时,不会得到结果。

因此,请确保在第一个递归级别中,将headA分配给了预期节点的地址。

关于c - 无法使用指向该变量的指针来更改其他函数中的局部变量的状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34991436/

10-14 17:02
查看更多