我正在尝试编写一个将合并2个链接列表并返回合并列表的函数。我做到了,但是我不得不使用lastPtr
。问题是最后的while循环迭代创建了比必要多一个的节点。所以问题是我如何删除无用的lastPtr
?
有代码:
NodePtr merge(NodePtr s1, NodePtr s2)
{
NodePtr s3, currPtr, lastPtr;
s3 = malloc(sizeof(Node));
currPtr = s3;
while(s1 != NULL){
currPtr->ch = s1->ch;
currPtr->nextPtr = malloc(sizeof(Node));
currPtr = currPtr->nextPtr;
s1 = s1->nextPtr;
}
while(s2 != NULL){
lastPtr = currPtr;
currPtr->ch = s2->ch;
currPtr->nextPtr = malloc(sizeof(Node));
currPtr = currPtr->nextPtr;
s2 = s2->nextPtr;
}
lastPtr->nextPtr = NULL;
return s3;
}
答案 0 :(得分:2)
您可以通过使用lastPtr
(或Node **
)变量指向NodePtr *
链接来删除->nextPtr
。它还可以指向列表变量s3
的开头。这样就可以在无需特殊情况下即可创建代码的情况下创建列表的第一个元素:
NodePtr merge(NodePtr s1, NodePtr s2)
{
NodePtr s3 = NULL;
NodePtr *currPtrPtr = &s3;
while(s1 != NULL){
*currPtrPtr = malloc(sizeof(Node));
(*currPtrPtr)->ch = s1->ch;
currPtrPtr = &(*currPtrPtr)->nextPtr;
s1 = s1->nextPtr;
}
while(s2 != NULL){
*currPtrPtr = malloc(sizeof(Node));
(*currPtrPtr)->ch = s2->ch;
currPtrPtr = &(*currPtrPtr)->nextPtr;
s2 = s2->nextPtr;
}
*currPtrPtr = NULL;
return s3;
}