当前位置: 首页 > news >正文

剑指 Offer(第2版)面试题 18:删除链表的节点

剑指 Offer(第2版)面试题 18:删除链表的节点

  • 剑指 Offer(第2版)面试题 18:删除链表的节点
    • 题目一:在 O(1) 时间删除链表结点
    • 题目二:删除链表中重复的节点

剑指 Offer(第2版)面试题 18:删除链表的节点

题目一:在 O(1) 时间删除链表结点

题目来源:

  1. 28. 在 O(1) 时间删除链表结点
  2. LeetCode 237. 删除链表中的节点

算法:

  1. 得到要删除节点的下一个节点 pNext;
  2. 将 pNext->val 赋给 node->val;
  3. 让 node 指向 pNext->next;
  4. delete pNext。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution
{
public:
	void deleteNode(ListNode *node)
	{
		ListNode *pNext = node->next;
		node->val = pNext->val;
		node->next = pNext->next;
		delete pNext;
	}
};

复杂度分析:

时间复杂度:O(1)。

空间复杂度:O(1)。

题目二:删除链表中重复的节点

题目来源:29. 删除链表中重复的节点

代码 1:书上的版本,很长,但是没有内存泄漏

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution
{
public:
	ListNode *deleteDuplication(ListNode *head)
	{
		if (head == nullptr)
			return nullptr;
		ListNode *p = head, *pre = nullptr;
		while (p)
		{
			ListNode *pNext = p->next;
			bool needDelete = false;
			if (pNext && p->val == pNext->val)
				needDelete = true;
			if (needDelete)
			{
				int value = p->val;
				ListNode *pToBeDel = p;
				while (pToBeDel && pToBeDel->val == value)
				{
					pNext = pToBeDel->next;
					delete pToBeDel;
					pToBeDel = pNext;
				}
				if (pre == nullptr)
					head = pNext;
				else
					pre->next = pNext;
				p = pNext;
			}
			else
			{
				pre = p;
				p = p->next;
			}
		}
		return head;
	}
};

代码 2:简化版,没有 delete 重复节点,存在内存泄漏

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution
{
public:
	ListNode *deleteDuplication(ListNode *head)
	{
		auto dummy = new ListNode(-1); // 建立虚拟头结点
		dummy->next = head;			   // 虚拟头结点指向头结点
		auto p = dummy;

		while (p->next) // p的下一个节点不为空
		{
			auto q = p->next;
			// q的下一个节点不为空,且q的下一个节点的值等于p的下一个节点的值
			while (q->next && q->next->val == p->next->val)
				q = q->next;
			// 如果q==p的下一个节点 p=q
			if (q == p->next)
				p = q;
			// 如果不是说明存在重复元素,则p指向q的下一个节点即非重复节点
			else
				p->next = q->next;
		}
		
		return dummy->next;
	}
};

复杂度分析:

时间复杂度:O(n),其中 n 是链表的长度。

空间复杂度:O(1)。

相关文章:

  • [组合数学]LeetCode:2954:统计感冒序列的数目
  • 三、DVP摄像头调试笔记(图片成像质量微调整,非ISP)
  • JavaScript 基础
  • 深入理解指针3
  • 软著项目推荐 深度学习的水果识别 opencv python
  • Hadoop学习笔记(HDP)-Part.14 安装YARN+MR
  • Python自动化——driver.switch_to的用法
  • 免费数据采集软件,多种数据采集方式
  • 混音编曲软件tudio One 6.5.1 保姆级安装教程
  • CopyOnWriteArrayList怎么用
  • Javafx实现浏览器
  • 【UGUI】sprite精灵的创建与编辑
  • 【LeetCode刷题笔记】103. 二叉树的锯齿形层序遍历
  • 基于ssm vue的风景文化管理平台源码和论文
  • Scrum敏捷开发流程及支撑工具
  • 计数问题(数位DP)
  • C/C++内存管理
  • 【软件测试】技术精选:Jmeter常见的几种报错
  • IDEA2023版本创建Sping项目只能勾选17和21,却无法使用Java8?(已解决)
  • qt使用qproperty在css中设置自定义的qobject类属性
  • 第二期人工智能能力建设研讨班在京开班,近40国和区域组织代表参加
  • 多元史料下的“西狩”叙事——《“庚子西狩”中外资料六种》解题
  • 黄土是他们的气质:打破宁夏当代油画创作的沉寂
  • 著名文物鉴赏家吴荣光逝世,享年78岁
  • 梅花奖在上海|朱洁静:穿越了人生暴风雨,舞台是最好良药
  • 图集︱“中国排面”威武亮相