移除链表元素

   力扣题号:203. 移除链表元素

一、题目描述

在链表中删除指定值的元素。

二、示例

输入:[1→4→2→4],val = 4

输出:[1→2]

三、求解思路

链表删除元素的原理就是,找到要删除元素的节点,让删除元素的前一个结点的next指针指向删除结点next指针指向的结点。有两种删除方法,第一种是直接使用原来的链表进行删除,但是需要处理头结点符合删除条件时的情况。第二种是使用一个虚拟头结点,最后要把虚拟头结点释放掉。

四、代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

typedef struct Lnode {
	int data;
	struct Lnode* next;
}Lnode,*Linklist;


/*
头插法插入链表
参数说明
L -- 传入链表
x -- 结点上的数据
*/
bool headInsert(Linklist& L, int x) {

	Lnode* newnode = (Lnode*)malloc(sizeof(Lnode));
	if (newnode == NULL) {
		return false;
	}
	newnode->data = x;
	newnode->next = L;
	L = newnode;

	return true;
}

/*
直接删除法
参数说明
arr -- 传入二维数组
n -- 数组的长度
*/

void  directMethod(Linklist& L, int val) {
	
	// 删除符合条件的头结点
	while (L != NULL && L->data == val) {
		Lnode* p = L;
		L = L->next;
		free(p);
	}
	// 删除符合条件的其他结点
	Lnode* cur = L;
	while (cur != NULL && cur->next != NULL)
	{
		if (cur->next->data == val) {
			Lnode* p = cur->next;
			cur->next = cur->next->next;
			free(p);
		}
		else {
			cur = cur->next;
		}
	}
}

/*
虚拟头结点法
参数说明
arr -- 传入二维数组
n -- 数组的长度
*/
void virtualHeadMethod(Linklist& L, int val) {

	Lnode* dummyHead = NULL;
	dummyHead = (Lnode*)malloc(sizeof(Lnode)); // 创建一个虚拟头结点
	dummyHead->next = L;

	Lnode* cur = dummyHead;
	while(cur != NULL && cur->next != NULL) {
		if (cur->next->data == val) {
			Lnode* p = cur->next;
			cur->next = cur->next->next;
			free(p);
		}
		else{
			cur = cur->next;
		}
	}
	L = dummyHead->next;
	free(dummyHead);
}


/*
打印链表
参数说明
L -- 传入链表
*/
void print(Linklist L) {

	if (L == NULL) {
		return;
	}
	while (L) {
		printf("%3d", L->data);
		L = L->next;
	}
	printf("\n");
}


int main() {

	// 创建链表
	Linklist L = NULL;
	headInsert(L, 1);
	headInsert(L, 2);
	headInsert(L, 2);
	headInsert(L, 3);
	headInsert(L, 5);
	headInsert(L, 7);
	headInsert(L, 7);

	printf("Linklist:\n");
	print(L);

	// 直接删除法
	printf("Result: delete (%d)\n",7);
	directMethod(L, 7);
	print(L);
	// 虚拟头结点法
	printf("Result: delete (%d)\n", 2);
	directMethod(L, 2);
	print(L);

	return 0;
}

五、运行结果

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值