C++ 刷题笔记_8 移除链表元素

提示:力扣第203题
本文章在vscode运行,与力扣实际答案可能不符


题目

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
在这里插入图片描述


解题思路

设置一个虚拟头结点,原链表的所有节点按照统一的方式进行移除。
移除的方式其实就是寻找val的前驱,使其的next指向val的next,如图所示,val=1
然后记得delete掉被移除的元素,释放内存
在这里插入图片描述
最后return头结点的时候,要return dummyNode->next; 这才是新的头结点

题解

代码如下(示例):

#include<iostream>
#include<vector>	//包含vector的头文件

using namespace std;

/*定义链表结点结构体*/
struct ListNode{
    int val;
    ListNode *next;
    ListNode():val(0),next(NULL){}	//构造函数,初始化结点
    ListNode(int x):val(x),next(NULL){}
    ListNode(int x,ListNode *next):val(x),next(next){}
};

class Solution{
    public:
    ListNode *removeElements(ListNode *head,int val){
        ListNode *p = new ListNode(0);	//设置虚拟头结点
        p->next = head;		//使虚拟头结点指向真实的头结点
        ListNode *cur = p;	//设置指针cur来遍历
        while(cur->next != NULL)
        {
            if(cur->next->val == val)
            {
                ListNode *temp = cur->next;
                cur->next = temp->next;
                delete temp;
            }
            else
            {
                cur = cur->next;
            }
        }
        head = p->next;		//新的头结点
        delete p;		//释放虚拟头结点内存
        return head;
    }
    ListNode *createlist(int n){
        ListNode *Head = new ListNode(0);	//创造头结点,val值为0,next指向空
        ListNode *pre = Head;		//设置指针pre指向头结点,然后遍历加新值,创造出自己赋值的链表
        cout << "依次输入" << n << "个链表的值" <<endl;
        for(int i = 0;i<n;i++)
        {
            ListNode *t = new ListNode;
            cin >> t->val;
            pre->next = t;
            pre = t;
        }
        return Head;
    }
};


int main(void)
{
    Solution s;
    int nums;
    cout << "输入链表的长度: " ;
    cin >>nums;
    ListNode *h = s.createlist(nums);	//h为自己创造链表的头结点
    ListNode *result = s.removeElements(h,6);	//把h和指定移除值6传入removeElements的参数中,
                                               //得到result为移除后的链表
    ListNode *a = result->next;		//遍历输出
        int b = 0;
        cout << "删除后的链表值为: ";
        while(a != NULL)
        {
            b = a->val;
            cout << b << " ";
            a = a->next;
        }
    return 0;

}

运行结果1:
在这里插入图片描述

运行结果2:
在这里插入图片描述


总结

感觉创造链表的函数代码有点冗长,有想法的佬请在评论区指点一下!
如果我的文章帮到你了,就请点个赞吧!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值