提示:力扣第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:
总结
感觉创造链表的函数代码有点冗长,有想法的佬请在评论区指点一下!
如果我的文章帮到你了,就请点个赞吧!