给定以下数据结构:
typedef struct list{
int num1, num2, num3;
struct list * next;
} node;
我用这个函数来解链一个节点,如果它满足X条件,然后把它链接到另一个链表,这样我就有了一个包含所有解链节点的链表。
void delinkNodes(node * register, node ** registerDeleted) {
node * auxNode;
while(register->next!= NULL && register->next->next!= NULL) {
if (helperCheckCondition(register->next)) {
printf("De-linking node!n");
auxNode= register->next->next;
*registerDeleted= register->next;
register->next=auxNode;
}
else {
register=register->next;
}
}
}
它可以工作,因为在调用函数之后,如果我尝试遍历新的链表,它会打印出最后一个断开链接的节点。
问题是:它只是最后一个断开连接的节点。我似乎无法想到脱钩节点连接在一起的一种方式。然后还有另一个问题,即将最后一个节点->nextvalue设置为NULL。
不写代码的答案(目前…):我需要使用什么才能以最好的方式解决这个问题?更多辅助变量…一些我可能忘记的模式…有提示吗?
一些问题:
-
您需要区分要添加到结果列表中的第一个节点和下一个节点:只有第一次需要分配给
*registerDeleted
,因为这是该列表的头节点,但其他时候您需要扩展该列表,这不会影响*registerDeleted
的值。因此,您需要一个辅助变量,它将指向结果列表的尾部。 -
register->next->next != NULL
条件提示尾节点不可能被删除。这可能不是你想要的。 -
不要忘记将结果列表中最后一个
next
指针设置为NULL
。
如果你不明白,这里有一个隐藏的解决方案:
<引用类>void delinkNodes(node * register, node ** registerDeleted) {
if (register == NULL) return;
node * currentNode = register->next;
node * tailNode = NULL;
while (currentNode != NULL) {
if (helperCheckCondition(currentNode)) {
printf("De-linking node!n");
register->next = currentNode->next;
if (tailNode == NULL) { // First time only
tailNode = *registerDeleted = currentNode;
} else {
tailNode = tailNode->next = currentNode;
}
tailNode->next = NULL; // Make sure the end of the list is marked!
}
else {
register = currentNode;
}
currentNode = register->next;
}
}