题目描述:
给你一个链表的头节点 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 输出:[]
思路:
通过递归,选择性指向下一个节点或者下一节点的下一节点
listnode* deletenode(listnode* head, int val) {//
if (head == NULL) return NULL;//若这个点为空,则判断结束,变为空节点
head->next = deletenode(head->next, val);//进入到下一个节点的判断
return head->data == val ? head->next: head;//如果说当前节点值等于目标值,那么将当前节点舍去,指针指向下一个节点,并继续做判断,否则就指向当前节点
}
整体代码:
#include<bits/stdc++.h>
using namespace std;
vector<int>a;
struct listnode
{
int data;
listnode* next;
listnode(int i = 0, listnode*a=NULL) :data(i), next(a){}
};
listnode* deletenode(listnode* head, int val) {//
if (head == NULL) return NULL;//若这个点为空,则判断结束,变为空
head->next = deletenode(head->next, val);//进入到下一个节点的判断
return head->data == val ? head->next: head;//如果说当前节点值等于目标值,那么将当前节点舍去,指针指向下一个节点,并继续做判断,
//否则就指向当前节点
}
int main() {
int num;
while (1) {
cin >> num;
a.push_back(num);
if (cin.get() == '\n') break;
}
listnode* head = new listnode();//头节点
listnode* p = head;//当前节点
for (int i = 0; i < a.size();i++) {//生成链表
listnode* q = new listnode(a[i]);
p->next = q;
p = q;
}
cin >> num;
deletenode(head, num);
p = head;
while(p->next!=NULL){
p = p->next;
cout << p->data<<" ";
}
}
结果:
1 2 6 3 4 5 6
6
1 2 3 4 5
7 7 7 7
7
题目来源