我正在尝试删除链表的最后一个节点, 我有列表的第一个元素。但是这个功能不起作用如果你能帮助我我会很高兴
代码 -
void deleteNode(Node* firstNode)
{
Node* currNode = firstNode;
while (currNode->next != NULL)
{
currNode = currNode->next;
}
delete currNode->next;
currNode->next = NULL;
}
答案 0 :(得分:2)
您需要考虑以下几点:
那就是说,
指针指针
void deleteLastNode(Node** firstNode)
{
while (*firstNode && (*firstNode)->next)
firstNode = &(*firstNode)->next;
free(*firstNode); /**/
*firstNode = NULL; /**/
}
请注意,如果传入in-address的指针已经为NULL,上面标有/**/
的行都不需要执行,但是无害,因为{{ 1}} - 根据标准支持free()
作为无操作。
通过传递头部指针的地址来调用,如果列表为空,必须的内容为NULL
。
NULL
指针的引用
使用C ++,您还可以通过引用传递头指针,例如:
Node *head = NULL;
//... code to populate the list.
deleteLastNode(&head);
调用为:
void deleteLastNode(Node*& head)
{
Node **firstNode = &head;
while (*firstNode && (*firstNode)->next)
firstNode = &(*firstNode)->next;
free(*firstNode); /**/
*firstNode = NULL; /**/
}
您选择哪种机制取决于您。
答案 1 :(得分:2)
您正在删除最后一个节点之后的节点,无论如何都应为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;
}
答案 2 :(得分:1)
您将在最终节点之后删除一个。
delete currNode;
答案 3 :(得分:1)
试试这个:
void deleteNode(Node *firstNode)
{
Node* currNode = firstNode;
Node* nextNode = firstNode->next;
while(nextNode != NULL)
{
currNode = nextNode;
nextNode = nextNode->next;
}
delete currNode;
}
答案 4 :(得分:1)
代码的问题是,在最后一个实例中,curNode指向列表的最后一个节点。当您删除curNode时,您将不再留下节点,即数据和下一部分。所以你现在无法访问curNode的下一部分。此代码将导致运行时错误:
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;
}
}
而是试试这个:
如果列表只包含一个元素,则firstNode指向NULL并删除唯一的节点。如果列表中有两个以上的项,则必须迭代到最后一个第二个元素,将其下一个值设置为NULL,并在临时指针的帮助下删除最后一个节点。
ShowLoadingAlert
答案 5 :(得分:0)
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
}
}
答案 6 :(得分:-2)
实际上,你应该这样写:
void deleteNode(Node* firstNode)
{
Node* currNode = firstNode;
while (currNode->next != NULL)
{
currNode = currNode->next;
}
***delete currNode;
currNode = NULL;***
}
原因,currNode是最后一个节点。