c -解除节点链接并将其链接到另一个链表的功能?



给定以下数据结构:

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