`

《算法之美》の链表问题の记住头元素+删除元素

 
阅读更多

记住头元素:

单向链表的头元素必须至始至终要记住,否则链表将会在内存中丢失。这意味着在链表第一个元素之前插入新元素或删除链表第一个元素时,指向链表头的指针或引用必须更新。

C/C++中,很容易因误用指针而犯错误,如下面代码,它在链表的前面插入一个元素:

bool insertInFront(IntElement *head, int data)

{

IntElement *newItem = new IntElement;

if(!newItem)

return false;

newItem->data = data;

newItem->next = head->next;

head = newItem; //错误

return true;

}

上面的代码是不正确的,因为它只更新了头指针的“本地拷贝”。正确的版本是传入一个头元素指针的指针:

bool insertInFront(IntElement **head, int data)

{

IntElement *newItem = new IntElement;

if(!newItem)

return false;

newItem->data = data;

newItem->next = head->next;

*head = newItem; //正确啦

return true;

}

当然,在C++中,头指针也可以通过引用来传递。

删除单个元素:

bool deleteElement(IntElement **head, IntElement *deleteMe)

{

IntElement *elem = *head;

if(deleteMe == *head) //要删除的是头元素

{

*head = elem->next;

delete deleteMe;

return true;

}

while(elem)

{

if(elem->next == deleteMe)

{

elem->next = deleteMe->next;

delete deleMe;

return true;

}

elem = elem->next;

}

return false;

}

删除链表中的所有元素:

void deleteList(IntElement **head)

{

IntElement *deleteMe = *head;

while(deleteMe)

{

IntElement *next = deleteMe->next;

delete deleteMe;

deleteMe = next;

}

*head = NULL;

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics