题目描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
-
此题对比原题有改动。
-
题目保证链表中节点的值互不相同。
-
该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点。
数据范围: 0<=链表节点值<=10000 0<=链表长度<=10000 。
示例
输入:
2 5 1 9
5
输出:
2 1 9
说明: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 2->1->9。
输入:
2 5 1 9
1
输出:
2 5 9
说明:给定你链表中值为1的第三个节点,那么在调用了你的函数之后,该链表应变为 2->5->9。
思路
输入链表与要删除的结点,然后循环链表,当结点值与要删除的结点值相同,则跳过该值,往后循环;若不同,则输出该结点值。
具体实现
#include<bits/stdc++.h>
using namespace std;
struct LNode{
int data;
LNode* next;
LNode():data(0),next(nullptr){} //初始化
LNode(int x):data(x),next(nullptr){}
};
int main(){
int data,data1;
LNode* head = new LNode(); //定义头结点
LNode* p = head; //p保存头结点
while(cin>>data){
LNode* s = new LNode(data);
head->next = s;
head = head->next;
if(cin.get()=='\n') break; //当换行时,就跳出循环,即输出完毕!
}
cin>>data1; //输入要删除的结点值
p=p->next; //p指向head的第一个数,而不是从空头结点开始
while(p){
if(p->data == data1){
p=p->next;
}else{
cout<<p->data<<" ";
p=p->next;
}
}
return 0;
}
小结
链表的基本操作要熟悉运用。