我想删除链表中的最后一个节点,但是似乎做错了,因为没有元素被删除。
void deleteTail(){
node *temp = head;
int iterator = 1;
if (head == NULL)
{
cout<<"Nothing to be deleted."<<endl;
}
else if (head == tail)
{
temp = head;
delete(temp);
head = NULL;
tail = NULL;
}
else
{
while(temp->next != NULL){
temp = temp -> next;
}
tail = temp;
temp = temp->next;
delete(temp);
}
}
如果链接列表是 1-> 2-> 3-> 4-> 5-> NULL 我希望它变成 1-> 2-> 3-> 4-> NULL。 我的代码在做什么错? 预先感谢!
答案 0 :(得分:1)
这应该可以完成工作。
while (temp->next != NULL && temp->next->next != NULL) {
temp = temp->next;
}
tail = temp;
delete temp->next;
temp->next = NULL;
问题出在循环的结尾,temp
指向最后一个元素。之后,将temp
设置为temp->next
,或者将NULL
设置为。之后,您将通过delete
调用NULL
,而该呼叫什么都不做。
编辑:当然,这会进入最后一个else
块。
答案 1 :(得分:0)
编辑:由于这是原始问题,因此将倒数第二个节点删除。
您需要跟踪以前的节点。当您删除最后一个节点(倒数第二个节点)之前的节点时,尾部保持不变,但是您必须将倒数第二个节点之前的节点指向尾部:
while (temp->next != NULL) {
if ((temp->next->next != NULL) &&
(temp->next->next->next == NULL)) { // the second node after temp is tail
delete temp->next; // delete second-to-last node
temp->next = tail; // two nodes back set to tail
break;
}
temp = temp->next;
}
答案 2 :(得分:0)
while(temp->next != NULL){
temp = temp -> next;
}
tail = temp;
temp = temp->next;
delete(temp);
确实很接近,但是while(temp->next != NULL)
仅在链接列表的末尾为假。这意味着代码已迭代到最后一个节点,为其本身分配了tail
,并删除了终止链接列表的空指针。
代替
while(temp->next != tail){
temp = temp -> next;
}
tail = temp;
temp = temp->next;
delete(temp);
tail->next = NULL;
此操作将在指向列表中倒数第二个tail
的节点上停止,将倒数第二个分配为新的tail
,delete
旧的{{1} },并以tail
tail
有一个出色的general case using a pointer to a pointer here,可以大大简化代码。