取消 link 节点并将它们 link 到另一个 linked 列表的功能?
Function to de-link nodes and linking them to another linked list?
给定以下数据结构:
typedef struct list{
int num1, num2, num3;
struct list * next;
} node;
我有这个功能去 link 一个节点,以防它满足 X 条件,然后 link 它到另一个 linked 列表,这样我就有一个 linked 列表,包含所有 delinked 节点。
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;
}
}
}
它的工作原理是在调用该函数后,如果我尝试遍历新的 linked 列表,它会打印出最后一个 delinked 节点。
问题是:它只是最后一个 delinked 节点。我似乎想不出一种 link 将 delinked 节点组合在一起的方法。
然后是将最后一个节点->nextvalue 设置为 NULL 的另一个问题。
无需在答案中编写代码(目前..):我需要使用什么才能以最好的方式解决这个问题?更多辅助变量...我可能会忘记一些模式...有什么提示吗?
一些问题:
你需要区分第一个节点添加到结果列表和下一个:只有第一次你需要分配给*registerDeleted
,因为这是该列表的 head 节点,但其他时候您需要扩展该列表,这不会影响 *registerDeleted
的值。因此,您需要一个指向该结果列表的 tail 的辅助变量。
条件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;
}
}
给定以下数据结构:
typedef struct list{
int num1, num2, num3;
struct list * next;
} node;
我有这个功能去 link 一个节点,以防它满足 X 条件,然后 link 它到另一个 linked 列表,这样我就有一个 linked 列表,包含所有 delinked 节点。
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;
}
}
}
它的工作原理是在调用该函数后,如果我尝试遍历新的 linked 列表,它会打印出最后一个 delinked 节点。
问题是:它只是最后一个 delinked 节点。我似乎想不出一种 link 将 delinked 节点组合在一起的方法。 然后是将最后一个节点->nextvalue 设置为 NULL 的另一个问题。
无需在答案中编写代码(目前..):我需要使用什么才能以最好的方式解决这个问题?更多辅助变量...我可能会忘记一些模式...有什么提示吗?
一些问题:
你需要区分第一个节点添加到结果列表和下一个:只有第一次你需要分配给
*registerDeleted
,因为这是该列表的 head 节点,但其他时候您需要扩展该列表,这不会影响*registerDeleted
的值。因此,您需要一个指向该结果列表的 tail 的辅助变量。条件
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;
}
}