力扣面试题05:删除链表元素

题意:删除链表中等于给定值 val 的所有节点。

示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]

示例 2: 输入:head = [], val = 1 输出:[]

示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]

这道题目目的考察的就是链表的节点中元素删除,链表室友一个个节点组成的,节点包含数据域与指针域,如下图所示

struct ListNode
{
  int val;//数据域
  ListNode*next;//指向下一个节点的指针
  ListNode(int x):val(x),next(NULL){}//构造函数
};


这里就涉及如下链表操作的两种方式:

  • 直接使用原来的链表来进行删除操作。
  • 设置一个虚拟头结点在进行删除操作。

来看第一种操作:直接使用原来的链表来进行移除。

直接上代码:

class Solution
{
public:
	struct ListNode
	{
		int val;//数据域
		ListNode* next;//指向下一个节点的指针
		ListNode(int x) :val(x), next(NULL) {}//
	};
//删除头节点
	ListNode* RemoveNode(ListNode* head, int val) {
		while (head != NULL && head->val == val) {
			ListNode* temp = head;//创建一个临时节点指向头节点
			head->next = head;//令头结点的指针指向新的头结点
			delete temp;//内存释放
		}
		//删除非头结点
		ListNode* cur = head;//设置当前结点
		while (cur != NULL && cur->next != NULL) {
			if (cur->next->val== val) {//cur->next就是当前节点的指针,然后指向下一个节点
				ListNode* tmp = cur->next;
				cur->next = cur->next->next;//令当前节点的指针等于下一个节点的指针
				delete tmp;
			}
			else
			{
				cur = cur->next;//不断更新当前节点
			}
		}
		return head;
	}

第二种 创建虚拟头结点,这样就不用删除头结点了,建议用这用方法

//创建虚拟节点
ListNode* RemoveElements(ListNode* head, int val) {
	ListNode* dummyHead = new ListNode(0);//创建虚拟节点
	dummyHead->next = head;//令这个虚拟头节点指针head
	ListNode* cur = dummyHead;//创建当前节点
	while (cur->next != NULL) {//如果当前节点指向的下一个节点不为空,一直循环
		if (cur->next->val == val) {
			ListNode* tmp = cur->next;
			cur->next = cur->next->next;
			delete tmp;
		}
		else
		{
			cur = cur->next;
		}
	}
	head = dummyHead->next;//最后令这个虚拟节点的指针指向头结点
	delete dummyHead;//内存释放
	return head;
}

由上述代码可以看到,创建虚拟节点的时间复杂度明显要高于第一种方法。

今天的分享就到这里,希望对各位小伙伴有帮助,给个赞鼓励一下吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值