题目描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
1.题目保证链表中节点的值互不相同
2.该题只会输出返回的链表和结果做对比,所以若使用C或者C++语言,你不需要free或delete被删除的节点。
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000
示例1
输入:
{2,5,1,9},5
返回:
{2,1,9}
说明:给定链表中值为5的第二个节点,那么在调用了函数之后,链表应变回2->1->9
示例2
输入:
{2,5,1,9},1
返回:
{2,5,9}
说明:给定链表中值为1的第三个节点,那么在调用了函数之后,链表应变回2->5->9
题目来源
略
思路
从链表头逐个查找,找到值与给定值相等的节点N。删除节点时,直接将下一节点值赋给N的data,同时将下一节点的next指针赋给N的next指针。实际上相当于把此节点变成下一个节点,删除的是原来的下一个节点(李代桃僵)。
具体实现
#include <iostream>
#include <string>
#include "linklist.cpp"
using namespace std;
int main()
{
//int indata = 0;
int tempval = 0;
int lastval = 0;
bool listbegin = false;
bool listend = false;
//char in_ch;
string str;
string temp;
linklist p ;
linklist a ;
creat_taillist(a, 1);
int innode = 1;//初始节点数
cout<< "input:"<<endl ;
cin>>str;
for(int i =0;i<str.length();i++)
{
if(str[i]==' ')
{
continue;
}
if(str[i]=='{')
{
listbegin =true;
continue;
}
if(str[i]=='}')
{
listend = true;
tempval = atoi(temp.c_str());
//cout<<"tempval="<<tempval<<endl;
insert_list(a, innode++, atoi(temp.c_str()));
//show_list(a);
continue;
}
if(str[i]==',')
{
if(!listend)
{
tempval = atoi(temp.c_str());
//cout<<"tempval="<<tempval<<endl;
insert_list(a, innode++, atoi(temp.c_str()));
//show_list(a);
}
else{
}
temp="";
continue;
}
temp += str[i];
//cout<<"temp="<<temp<<endl;
}
lastval = atoi(temp.c_str());
if (a->data == lastval)
{
a=a->next;
}
else{
for(p=a->next;p!=NULL;p=p->next)
if(p->data == lastval)
{
p->data = p->next->data;
p->next = p->next->next;
break;
}
}
cout<<"{";
for (p = a->next; p != NULL; p = p->next)
{
cout << p->data << ",";
}
cout<<"\b\b\b"<<"} "<<endl;//输出格式太乱,不得已把最后三个输出消去
return 0;
}
时间复杂度
O(n)
小结
程序过于复杂,原因有以下2条:
1.控制台输入字符串的处理程序过于复杂;
2.链表定义创建部分是截取网上现成代码,与本题输入格式并不匹配。
下一步要熟练掌握输入的处理,以及链表的定义及功能实现。