我正在尝试了解从链表中删除节点,所以我使函数Node *deleteNode(int item. Node *head)
如下所示。 它确实删除了一个节点,但不会删除我在主函数中指定的节点。 如果我从 (1,2,3,4,5,6) 的链接 lsit 开始,它会返回 (1,3,4,5,6) 的列表。因此,出于某种原因,它总是删除第二个节点。我的 deleteNode 函数中的错误是什么导致了这种情况?
对于链表和摸索指针和节点,知道哪个指针指向什么以及链表的一般布局非常重要。当我试图向某人解释时,我经常在白板上画一幅画。只需绘制一个小图,其中包含一些节点和连接它们的指针。通过这种方式,您可以非常快速地看到必须重定向到其他节点才能从列表中删除节点的指针。
简而言之:使用绘图非常清楚该做什么,如果您知道该做什么,编码实际上并不难。
您需要真正考虑列表如何操作才能删除节点。我肯定会考虑从您的 deleteNode 中删除几个部分,以便它更顺畅地流动。请考虑以下事项:
Node *deleteNode(int item, Node *head){
Node * current = head, *pTemp = NULL, *pPrev = NULL;
while((current->link->info != item) && ((current -> link != NULL)) //You want to traverse the list until you find the item.
{
pPrev = current; // Assign previous pointer which is null to head of list and so on.
current = current->link // Assign current pointer to next node.
}
if (current->link-> info == item )
{
pTemp = current; // Assign temp pointer to current pointer
current = pTemp->link; // set current to next pointer
pPrev->link = current; // set previous pointer to current
free (pTemp)
}
else
{
// Did not find at all in list.
}
return head;
}
这都是通用的,并且是动态的,请调试您的代码并在纸上编写列表的结构。