Day20 删除链表的节点

题目描述

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

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.链表定义创建部分是截取网上现成代码,与本题输入格式并不匹配。

下一步要熟练掌握输入的处理,以及链表的定义及功能实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值