面试金典题2.1

news/2024/9/22 16:31:09/

编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例1:

 输入:[1, 2, 3, 3, 2, 1]
 输出:[1, 2, 3]

示例2:

 输入:[1, 1, 1, 1, 2]
 输出:[1, 2]

提示:

  1. 链表长度在[0, 20000]范围内。
  2. 链表元素在[0, 20000]范围内。

进阶:

如果不得使用临时缓冲区,该怎么解决?

这道题我一开始的思路新建一个链表,直接遍历判断链表是否存在当前遍历到的值,若未遍历到,则存入新的链表,若存在,则判断下一个值

leetcode代码

/**  * Definition for singly-linked list.  * struct ListNode {  *     int val;  *     ListNode *next;  *     ListNode(int x) : val(x), next(NULL) {}  * };  */  
class Solution {  
public:  ListNode* removeDuplicateNodes(ListNode* head) {  // 如果链表为空,则直接返回nullptr,因为没有节点需要处理  if(head == nullptr){  return head;  }  // 声明一个哈希表(unordered_set),用于存储已经出现过的节点值  // 初始时将头结点的值插入哈希表,因为头结点总是需要保留的(除非它是重复的,但这种情况在题目中未明确说明如何处理)  unordered_set<int> occurred = {head->val};  // pos指针用于遍历链表,初始时指向头结点  ListNode* pos = head;  // 遍历链表,直到pos的下一个节点为空(即链表末尾)  while(pos->next != nullptr){  // cur指针指向pos的下一个节点,即当前正在检查的节点  ListNode* cur = pos->next;  // 如果cur节点的值没有出现在哈希表中,说明它不是重复节点  if(!occurred.count(cur->val)){  // 将cur节点的值添加到哈希表中,表示该值已经出现过  occurred.insert(cur->val);  // 移动pos指针到下一个节点,继续检查  pos = pos->next;  }else{  // 如果cur节点的值是重复的,则删除该节点  // 通过将pos的next指针指向cur的next指针,实现跳过cur节点  pos->next = pos->next->next;  // 注意:这里不需要移动pos指针,因为pos的下一个节点(即原来的cur节点)已经被删除了  }  }  // 注意:在遍历结束后,pos指针会指向链表的最后一个非重复节点  // 由于链表末尾的next指针应该为nullptr,所以这里显式地将pos的next指针设置为nullptr  // 这一步其实是多余的,因为在遍历过程中,如果链表末尾的节点不是重复的,pos最终会指向它,并且它的next已经是nullptr了  // 但为了代码的清晰性和完整性,还是保留这一行代码  pos->next = nullptr;  // 返回处理后的链表头结点  return head;          }  
};
/**  * Definition for singly-linked list.  * struct ListNode {  *     int val;  *     ListNode *next;  *     ListNode(int x) : val(x), next(NULL) {}  * };  */  class Solution {  
public:  /**  * 移除链表中所有重复的节点,只保留原始节点链表中每个值第一次出现的节点。  * @param head 链表的头节点  * @return 移除重复节点后的链表的头节点  */  ListNode* removeDuplicateNodes(ListNode* head) {  if (head == nullptr) {  // 如果链表为空,则直接返回nullptr  return nullptr;  }  ListNode* ob = head; // ob(outer block)用于遍历整个链表  while (ob != nullptr) {  ListNode* oc = ob; // oc(outer current)用于在ob指向的节点之后查找重复节点  while (oc->next != nullptr) {  // 如果发现oc的下一个节点的值与ob相同,则移除oc的下一个节点  if (oc->next->val == ob->val) {    oc->next = oc->next->next;   } else {  // 如果没有发现重复,则oc继续向后移动  oc = oc->next;  }  }  // 完成ob节点之后所有重复节点的移除后,ob向后移动  ob = ob->next;  }  return head; // 返回修改后的链表的头节点  }  
};

因为问到不使用临时缓冲区,因此采用下面这种用时间换空间的做法。


http://www.ppmy.cn/news/1528915.html

相关文章

jQuery css() 方法

jQuery css() 方法 引言 在网页设计和开发中&#xff0c;样式是至关重要的&#xff0c;它决定了网页的视觉效果和用户体验。jQuery&#xff0c;作为一个广泛使用的JavaScript库&#xff0c;提供了强大的DOM操作能力&#xff0c;其中css()方法便是用于操作和获取元素样式的关键…

Qt优秀开源项目之二十三:QSimpleUpdater

QSimpleUpdater是开源的自动升级模块&#xff0c;用于检测、下载和安装更新。 github地址&#xff1a;https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多&#xff08;911个&#xff09;&#xff0c;但已在很多开源项目看到其身影&#xff0c;比如Not…

店铺所有商品API接口解析,用JSON格式的示例

以下是一个店铺所有商品接口数据的 JSON 格式示例&#xff1a; { "status": "success", "message": "获取商品列表成功", "data": [ { "product_id": "123456", "name": "商品名称1&qu…

BMC 虚拟i2c访问PCA9545(switch芯片)后面的设备,为什么找不到PCA9545?

1.说明 1.1 背景 无意中看到PCA9545(switch芯片)后面有设备&#xff0c;但是PCA9545设备本身是连接到物理设备i2c上的&#xff0c;然而扫描该物理i2c bus&#xff0c;却找不到该设备。此篇文章主要找一下该原因的。 1.2 参考代码 当前使用的是ast2600芯片&#xff0c;可参考…

Python办公自动化案例(四):将Excel数据批量保存到Word表格中

案例:将excel数据批量保存到Word表格中 要将Excel数据批量保存到Word表格中,可以使用Python的openpyxl库来读取Excel文件,以及python-docx库来创建和编辑Word文档。以下是一段示例代码,以及代码解释和一些注意事项。 准备好的Excel数据: 1.安装所需库 首先,确保你已经…

【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】010 - 二号内核线程 kthreadd线程 工作流程分析

【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】010 - 二号内核线程 kthreadd线程 工作流程分析 一、kthreadd 线程代码工作流程分析二、如何添加任务到 kthread_create_list 链表 中三、__kthread_create_on_node() 函数工作流程分析系列文章汇总:《鸿蒙OH-v5.0源码分析之 Uboo…

高效财税自动化软件的特点与优势

随着企业管理信息系统和互联网的不断发展&#xff0c;企业对财务管理提出了更高的要求。为有效助力企业规范财务工作&#xff0c;提高工作效率和准确性&#xff0c;实现信息化管理&#xff0c;越来越多的企业选择引入RPA等高效财税自动化软件。本文金智维将围绕RPA高效财税自动…

图像处理与OCR识别的实践经验(2)

上一篇 &#xff1a;图像处理与OCR识别的实践经验&#xff08;1&#xff09;-CSDN博客 3. 图像预处理技术 在OCR系统中&#xff0c;图像预处理的质量直接决定了最终的识别效果。好的预处理技术能够显著提高文字区域的清晰度&#xff0c;从而提升OCR引擎的识别准确率。以下是常见…