我正在尝试删除链接列表的最后一个节点,我有这个列表的第一个元素。但是这个功能不起作用,如果你能帮我,我会很高兴
代码-
void deleteNode(Node* firstNode)
{
Node* currNode = firstNode;
while (currNode->next != NULL)
{
currNode = currNode->next;
}
delete currNode->next;
currNode->next = NULL;
}
您正在删除最后一个节点之后的一个,该节点无论如何都应该为NULL。
void deleteNode(Node* firstNode)
{
//first check if firstNode is NULL or last node.
if(firstNode == NULL)
return;
if(firstNode->next == NULL)
{
delete firstNode;
firstNode = NULL;
return;
}
Node* currNode = firstNode;
while (currNode->next && currNode->next->next != NULL)
{
currNode = currNode->next;
}
delete currNode->next;
currNode->next = NULL;
}
您需要考虑以下几点:
- 任何可能影响头指针的操作都必须提供一种返回更新的头指针的机制(输入/输出参数,即指向指针的指针或指针的引用,或按函数返回结果;我更喜欢前者)
- 任何包含列表中最后一个节点地址的指针,无论是头指针还是其他指针,都必须设置为NULL
也就是说,
指向指针的指针
void deleteLastNode(Node** firstNode)
{
while (*firstNode && (*firstNode)->next)
firstNode = &(*firstNode)->next;
free(*firstNode); /**/
*firstNode = NULL; /**/
}
请注意,如果通过地址传递的指针已经为NULL,则不需要执行上面用/**/
标记的两行,但这是无害的,因为根据标准,free()
和NULL
都被支持为no-op。
通过传递头指针的地址来调用,如果列表为空,则的内容必须为NULL
。
Node *head = NULL;
//... code to populate the list.
deleteLastNode(&head);
指针的引用
使用C++,您还可以通过引用传递头指针,例如:
void deleteLastNode(Node*& head)
{
Node **firstNode = &head;
while (*firstNode && (*firstNode)->next)
firstNode = &(*firstNode)->next;
free(*firstNode); /**/
*firstNode = NULL; /**/
}
调用为:
Node *head = NULL;
//... code to populate the list.
deleteLastNode(head);
你选择哪种机制取决于你。
您正在删除最后一个节点之后的一个。
delete currNode;
试试这个:
void deleteNode(Node *firstNode)
{
Node* currNode = firstNode;
Node* nextNode = firstNode->next;
while(nextNode != NULL)
{
currNode = nextNode;
nextNode = nextNode->next;
}
delete currNode;
}
代码的问题是,在最后一个实例中,curNode指向列表的最后一个节点。当您删除curNode时,您将不再留下节点,即数据和下一部分。所以您现在无法访问curNode的下一部分。此代码将导致运行时错误:
currNode->next = NULL;
相反,试试这个:
如果列表只包含一个元素,则firstNode指向NULL,并且删除唯一的节点。如果列表中有两个以上的项,则必须迭代到最后一秒的元素,将其下一个值设置为NULL,并在临时指针的帮助下删除最后一个节点。
void pop_back(struct node** firstNode)
{
struct node* p = *firstNode;
if(p == NULL)
cout << "List empty." << endl;
else if(p->next == NULL){
cout << "Element " << p-> data << " deleted." << endl;
delete *firstNode;
*firstNode = NULL;
}
else
{
while(p->next->next != NULL){
p= p->next;
}
struct node* temp = p-> next;
p->next = NULL;
cout << "Element " << temp->data << " deleted." << endl;
delete temp;
}
}
void delBottom()
{
clrscr();
Node *nb=H; //current
Node *nn=(H->getNext()); //next
if(NULL==H)
{
cout<<"List Empty";
}
else if(H==T)
{
delete H; //H-Head
H=T=NULL;
}
else
{
while(NULL!=(nn->getNext()))
{
nb=nn;
nn=nn->getNext();
}
delete nn;
nb->setNext(NULL);
T=nb; //T-Tail
}
}
实际上,您应该这样写:
void deleteNode(Node* firstNode)
{
Node* currNode = firstNode;
while (currNode->next != NULL)
{
currNode = currNode->next;
}
***delete currNode;
currNode = NULL;***
}
原因,currNode是最后一个节点。