[蓝蓝计算机考研算法]-day16删除链表结点

108 阅读1分钟

题目描述

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

  1. 此题对比原题有改动。

  2. 题目保证链表中节点的值互不相同。

  3. 该题只会输出返回的链表和结果做对比,所以若使用 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;
}

小结

链表的基本操作要熟悉运用。