【leetcode05.12】203.移除链表元素

温习链表,学有所得
做链表题目之时,一定记得画图!记得画图!记得画图!

链表元素删除

分为两种情况——如果是头节点,直接后移即可;如果是非头节点,需要用到待删除节点的前一个节点,将待删除节点的后一个节点地址待删除节点的前一个节点的next。

代码如下:

listnode* deleteval(listnode *head,int val){//删除链表中值等于val的节点 
//链表中元素的删除分为两种情况——头节点和非头结点 
//如果是头节点的话,直接后移
//如果是非头结点,需要用到当前节点的前一个节点 
	if(!head) return NULL;//首先排除空链表的情况 
	while(head&&(head->val==val)){//1.头节点的情况 
		listnode *tmp = head;//暂存待删除节点 
		head = head->next;//指针后移 
		delete tmp;//删除节点 
	}
	listnode *tmp = head;//显然,当前的tmp的值不可能是要求的val 
	while(tmp&&(tmp->next)){ 
		if(tmp->next->val==val){
			listnode *del = tmp->next;
			tmp->next = tmp->next->next;
			delete del;
		}
		else tmp = tmp->next;
	}
	return head;
}

添加主函数进行本地测试

#include<iostream>
using namespace std;

struct listnode{//定义节点结构体 
	int val;//数值 
	listnode *next;//指针 
//	listnode(int r_val,listnode *r_next):val(r_val),next(NULL){} 
};

listnode* deleteval(listnode *head,int val){//删除链表中值等于val的节点 
//链表中元素的删除分为两种情况——头节点和非头结点 
//如果是头节点的话,直接后移
//如果是非头结点,需要用到当前节点的前一个节点 
	if(!head) return NULL;//首先排除空链表的情况 
	while(head&&(head->val==val)){//1.头节点的情况 
		listnode *tmp = head;//暂存待删除节点 
		head = head->next;//指针后移 
		delete tmp;//删除节点 
	}
	listnode *tmp = head;//显然,当前的tmp的值不可能是要求的val 
	while(tmp&&(tmp->next)){ 
		if(tmp->next->val==val){
			listnode *del = tmp->next;
			tmp->next = tmp->next->next;
			delete del;
		}
		else tmp = tmp->next;
	}
	return head;
}

listnode* creatlinklist(){//创建链表 
	int data;
	listnode *head = new listnode;
	listnode *r=head;
	while(cin>>data){
		listnode *tmp = new listnode;
		tmp->val = data;
		r->next = tmp;
		r = tmp;
//		tmp->next->val = data;
///		tmp = tmp->next;									
		if(getchar()=='\n') break;
	}
	r->next = NULL;
	return head->next;
}

void showlinklist(listnode *head){
	listnode *tmp = head;
	while(tmp){
		cout<<tmp->val<<" ";
		tmp = tmp->next;
	}
	cout<<"\n";
}

int main(){
	listnode *head = creatlinklist();
	showlinklist(head);
	int val;
	cin>>val;
	listnode *n_head = deleteval(head,val);
	showlinklist(n_head);
	return 0;
}

测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值