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能隐式转换成各类型指针
掌握链表概念及其定义,掌握链表初始化构建,掌握链表的一些操作
参考代码随想录