个人云笔记(现在内容少,不太建议大家看)
1、设置一个虚拟结点在进行移除节点操作
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
ListNode* cur = dummyHead;
while (cur->next != NULL) {
if (cur->next->val == val) {//创建一个临时指针 tmp,用于保存当前节点 cur 的下一个节点。
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else {
cur = cur->next;
}
}
head = dummyHead->next;//新链表的头结点。
delete dummyHead;
return head;
在移除链表中特定元素时,需要删除当前节点的下一个节点。为了在删除节点后不丢失对下一个节点的引用,可以使用临时指针 tmp
来保存下一个节点的指针。(GPT回答)
2、遍历链表时为什么要定义一个临时指针?而不是直接操作头指针?
因为我们操作完链表之后我们要返回头节点,如果直接操作头节点,头节点的只就改了,就无法返回头节点了。所以我们定义一个临时指针,让它指向头节点。
3、临时指针的作用
void deleteAtIndex(int index) {
if (index >= _size || index < 0) {
return;
}
LinkedNode* cur = _dummyHead;
while(index--) {
cur = cur ->next;
}
LinkedNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
//delete命令指示释放了tmp指针原本所指的那部分内存,
//被delete后的指针tmp的值(地址)并非就是NULL,而是随机值。也就是被delete后,
//如果不再加上一句tmp=nullptr,tmp会成为乱指的野指针
//如果之后的程序不小心使用了tmp,会指向难以预想的内存空间
tmp=nullptr;
_size--;
}
临时指针 tmp
的作用是在删除节点之前保存要删除的节点的地址,以便在释放内存后避免成为悬空指针。