①补充一些基础知识(链表删除单个结点、虚拟头结点)
1.链表删除单个结点
代码实现中 slow表示parent,cur表示tmpDelete。
2.虚拟头结点
为什么使用虚拟头结点来代码实现?
因为"循环不变量原则"!(文章螺旋矩阵有详细介绍循环不变量)
循环不变量,导致不需要对链表的头结点(头部)进行分类讨论。
使用虚拟头结点导致逻辑实现更加简单,代码更加简短。
②思路,遍历到满足条件的cur,进行链表删除单个结点即可。
其实本题是链表很基础的操作。
稍微小总结一下:
对于链表相关问题,画图、虚拟头结点一般很有用,
画图:知道了一共需要多少个变量(三个,parent,cur,fast)
虚拟头结点:本质是 "循环不变量"
③代码实现
class Solution {
public:
ListNode* removeElements(ListNode* head, int val)
{
ListNode VNode;//虚拟头结点
VNode.next=head;
//fast用于比较
//slow用于调整链表(指向)
ListNode* slow = &VNode;
ListNode* fast = head;
while(fast){
if(fast->val==val){
注释的两部分,是内存的释放操作
//ListNode* tmpDelete = fast;//①释放内存
slow->next = fast->next;
fast = fast->next;
/*if(tmpDelete){
delete tmpDelete;//②释放内存
}*/
continue;
}
slow = slow->next;
fast = fast->next;
}
return VNode.next;
}
};