C++删除单链表指定元素
对于C++单链表的创建与打印操作之前已经讲述过,那么普通的元素删除也可以很容易实现。在力扣203.移除链表元素中提出了一种元素删除操作,题目如下:
本来觉得很简单,但是在实现的过程中遇到了很多问题。这道题目的棘手之处就在于头结点的处理上,我们知道如果想要删除一个节点,只要让待删除节点前驱的Next
指向待删除节点的后继即可,那么如果头结点就是待删除的呢?对于头结点并不存在前驱,而且C++在堆区开辟的内存空间是需要手动释放的,所以具体代码实现起来还是要花费点功夫的,具体来说实现方式有两种。
方式一:无虚拟头结点
struct ListNode {
int val;//结点值
ListNode *Next;//指向后继结点
ListNode(int x) :val(x), Next(NULL) {
}//有参构造函数
};
ListNode *removeElements(ListNode *Head,int val)//删除指定元素
{
if (Head == NULL) return Head;//如果输入空链表,直接返回
while (Head->val == val) //判断头结点的元素值
{
//头结点就是待删除元素
ListNode *temp = Head;//保存头结点,方便内存释放
Head = Head->Next;//更新头结点,指向后继
delete temp;//释放内存
}
//进入这里说明头结点不是待删除元素,要对非头节点操作
ListNode *p = Head;//p指向头结点,需要判断p的后继是否为待删除元素
while ((p->Next) != NULL)//p的后继不能为空
{
if ((p->Next)->val == val)//p的后继为待删除元素
{
ListNode *temp = p-><