题目背景
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2:输入:head = [], val = 1 输出:[] 示例 3:
输入:head = [7,7,7,7], val = 7 输出:[]
提示:
列表中的节点在范围 [0, 104] 内 1 <= Node.val <= 50 0 <= k <= 50
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-linked-list-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(!head)
return head;
head->next = removeElements(head->next,val);
if(head->val == val)
return head->next;
else
return head;
}
};
解法二
- 移除链表元素,目前想写一个完整的,自己可运行的程序
- 首先定义出链表,定义一个单链表怎么定义呢,是一个结构体,在其中需要整体定义它的值,指向下一个的指针,构造函数,有值的构造函数,指向下一个节点链接的构造函数。一定要记住叫构造函数。
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),ListNode(next){}
}
- 有两种移除链表节点的方式
- 一是直接从原链表上移除,这个需要两个逻辑,一个是单独移除头节点,一个是移除除头节点以外的节点
ListNode* removeElements(ListNode* head,int val){
while(head!=NULL&&head->val == val){
ListNode* tmp = head;
head = head->next;
delete tmp;
}
ListNode* cur = head;
while(cur != NULL && cur->next!=NULL){
if(cur->next->val == val){
ListNode *tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}else{
cur = cur->next;
}
}
return head;
}
};
解法三
创建一个虚拟节点
class Solution{
public:
ListNode* removeElements(ListNode* head, int val){
ListNode* virtNode = new ListNode(0);
virtNode->next = head;
ListNode* cur = virtNode;
while(cur->val != NULL){
if(cur->next->val == val){
ListNode* mid = cur->next;
cur->next = cur->next->next;
delete mid;
}else{
cur = cur->next;
}
}
head = virtNode->next;
delete virtNode;
return head;
}
}