这是从单链表尾部删除元素的代码的一部分:
int SLList::deleteFromTail()
{
int el = tail->info;
//if the list has only one element
if(head == tail) {
delete head;
head = tail = 0;
}
else {
//some code here...
}
return el
}
这里head
和tail
分别指向LL的第一个和最后一个元素。
在上面的if
块中,delete head
我们将设置head = tail = 0
。
但是在我们删除了head
之后,我们如何才能将它的值设置为某些东西?(在这种情况下NULL
)
head是一个pointer
。您正在删除pointer
指向的object
,而不是pointer
本身
请考虑以下示例:
Foo *foo = new Foo(); //foo does not store Foo object. Just an adress of created object.
//do some stuff
delete foo; //object is deleted
foo = new Foo(); //create another Foo and make foo point to it
编辑指针只是一个对象的地址。当你写delete head
时,你会删除头部指向的对象,但即使在删除后,head pointer
也会指向与以前相同的位置。但是取消引用它(例如 *head
)会导致问题。
删除 head
后,创建新对象并将对象的地址分配给head
head = addressOfNewObject;