C++:Leetcode-链表-203移除链表元素

C++:Leetcode-链表-203移除链表元素

需要掌握知识点:链表基本概念、基本定义方式及其初始化、熟练掌握虚拟头结点的删除链表节点方法



题目

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

思路分析

1、创建虚拟头结点(方便对头节点的操作进行统一),指向真正的头结点head
2、查找目标val值,但对val值节点的上一个节点进行操作,将目标节点的上一个节点指针,指向目标节点的下一个节点
3、注意delete删除的元素

代码

/*
链表熟练练习
1、链表节点定义创建
2、创建一个新的链表
3、对链表进行删除操作

nullptr是C11新引入的关键字,目的就是代替NULL
下次遇到用NULL的时候就用nullptr
因为有的编译器会将NULL定义成0,nullptr能隐式转换成各类型指针
*/
#include "iostream"
#include "vector"
using namespace std;

//定义链表节点
class ListNode
{
    
    
public:
    int val;        //元素
    ListNode *next; //指向下一个节点的指针,类型也是ListNode,因为下一个节点也有val和指针!!!
    //构造函数初始化节点,构造函数初始化列表的形式
    ListNode() : val(0), next(nullptr) {
    
    }
    ListNode(int x) : val(x), next(nullptr) {
    
    }
    ListNode(int x, ListNode *l_next) : val(x), next(l_next) {
    
    }
};

//创建链表
//将vector转成链表
ListNode *createList(vector<int> &nums)
{
    
    
    ListNode *head = new ListNode(nums[0]); //初始化头结点
    ListNode *p = head;                     //赋值给p进行链表创建操作,防止改变head值
    for (int i = 1; i < nums.size(); i++)
    {
    
    
        p->next = new ListNode(nums[i]); //最开始p是head,p指针指向ListNode(nums[1])
        p = p->next;
    }
    return head; //创建完毕返回链表头结点
}

void printList(ListNode *head)
{
    
    
    ListNode *p = head;
    while (p != nullptr)
    {
    
    
        cout << p->val << "\t";
        p = p->next;
    }
    cout << endl;
}

//创建虚拟头结点方法
class Solution
{
    
    
public:
    ListNode *removeElements(ListNode *head, int val)
    {
    
    
        ListNode *dummyHead = new ListNode(0); //创建虚拟头结点
        dummyHead->next = head;                //虚拟头结点指向head
        ListNode *current = dummyHead;
        while (current->next != nullptr)
        {
    
    
            if (current->next->val == val) //删除val,让val上一个节点指向val下一个节点,所以要对val的上一个节点操作,因为对val这个节点操作的话是找不到上一个节点的
            {
    
    
                ListNode *temp = current->next; //将要删除的指针地址复制,再进行delete释放内存实现真正的删除,如果不复制直接删除current->next,会对下面的current->next->next有影响
                current->next = current->next->next;
                delete temp;
            }
            else
            {
    
    
                current = current->next; //向下移动
            }
        }
        head = dummyHead->next; //虚拟头结点的下一个为实际头结点
        delete dummyHead;
        return head;
    }
};
int main(int argc, const char **argv)
{
    
    
    vector<int> nums = {
    
    1, 7, 7, 7};
    ListNode *head = createList(nums);
    printList(head); //删除前
    Solution s1;
    ListNode *remove_head = s1.removeElements(createList(nums), 1);
    printList(remove_head); //删除后
    return 0;
}

总结

链表熟练练习
1、链表节点定义创建
2、创建一个新的链表
3、对链表进行删除操作

nullptr是C11新引入的关键字,目的就是代替NULL
下次遇到用NULL的时候就用nullptr
因为有的编译器会将NULL定义成0,nullptr能隐式转换成各类型指针
掌握链表概念及其定义,掌握链表初始化构建,掌握链表的一些操作

参考代码随想录

猜你喜欢

转载自blog.csdn.net/Bellwen/article/details/128403005