博客
关于我
【剑指Offer】面试题18:删除链表中重复的节点
阅读量:476 次
发布时间:2019-03-06

本文共 3193 字,大约阅读时间需要 10 分钟。

在一个已经排序好的链表中,存在重复的结点,我们需要删除这些重复结点。重复的结点不予保留,返回处理后得到的链表头指针。例如,链表1→2→3→3→4→4→5,处理后应变为1→2→5。

方法思路

为了解决这个问题,我们可以使用哈希集合(HashSet)的方法,这种方法可以在O(n)的时间复杂度内解决问题,并在最坏情况下的空间复杂度为O(n),其中n是链表的长度。具体步骤如下:

  • 初始化哈希集合:用于记录已遇到的节点值。
  • 遍历链表:从链表的头节点开始,逐个比较当前节点和下一个节点的值。
  • 删除重复节点
    • 如果当前节点的值在哈希集合中存在,说明这个节点是重复的,删除它以及连续重复的节点。
    • 如果不是重复的,将节点值加入哈希集合,并继续移动指针。
  • 处理头节点重复的情况:在遍历完头节点后,可能链表的头节点已经被删除了,需要重新找到链表的新头节点。
  • 处理中间和尾节点的重复情况:继续从新头节点开始,遍历整个链表,删除所有重复的节点。
  • 代码实现

    import java.util.HashSet;public class Solution18 {    public static void main(String[] args) {        ListNode1 listNode1 = new ListNode1(1);        ListNode1 listNode2 = new ListNode1(2);        ListNode1 listNode3 = new ListNode1(3);        ListNode1 listNode4 = new ListNode1(3);        ListNode1 listNode5 = new ListNode1(4);        ListNode1 listNode6 = new ListNode1(4);        ListNode1 listNode7 = new ListNode1(5);        listNode1.next = listNode2;        listNode2.next = listNode3;        listNode3.next = listNode4;        listNode4.next = listNode5;        listNode5.next = listNode6;        listNode6.next = listNode7;        ListNode1 res = deleteDupcreationHash(listNode1);        System.out.println(res);    }    public static ListNode1 deleteDupcreationHash(ListNode1 pHead) {        if (pHead == null || pHead.next == null) {            return pHead;        }        HashSet
    hashSet = new HashSet<>(); ListNode1 pre = pHead; ListNode1 cur = pHead.next; while (cur != null) { if (pre.val == cur.val) { hashSet.add(cur.val); } pre = cur; cur = cur.next; } while (pHead != null && hashSet.contains(pHead.val)) { pHead = pHead.next; } if (pHead == null) { return null; } pre = pHead; cur = pHead.next; while (cur != null) { if (hashSet.contains(cur.val)) { pre.next = cur.next; cur = cur.next; } else { pre = cur; cur = cur.next; } } return pHead; } public static ListNode1 deleteDupcreation(ListNode1 pHead) { if (pHead == null || pHead.next == null) { return pHead; } ListNode1 head = new ListNode1(Integer.MIN_VALUE); head.next = pHead; ListNode1 pre = head; while (pre.next != null) { cur = pre.next; if (cur.next != null && cur.next.val == cur.val) { while (cur.next != null && cur.next.val == cur.val) { cur = cur.next; } pre.next = cur.next; cur = cur.next; } else { pre = cur; cur = cur.next; } } return head.next; }}class ListNode1 { int val; ListNode1 next = null; public ListNode1(int val) { this.val = val; } @Override public String toString() { return "ListNode1{" + val + ", next=" + next + '}'; }}

    代码解释

    • 初始化:创建一个HashSet来存储已遇到的节点值。
    • 遍历链表:从链表的头节点开始,逐个检查节点的值。
    • 删除重复节点:当发现当前节点的值重复时,删除后续的重复节点,并更新指针。
    • 处理头节点:在遍历中可能遇到头节点被删除的情况,重新找到链表的新头节点。
    • 处理中间和尾节点:继续从新头节点开始,确保中间和尾部的重复节点也被删除。

    这种方法高效且简洁,能够在O(n)的时间复杂度内处理问题,适用于各种规模的链表。

    转载地址:http://zufdz.baihongyu.com/

    你可能感兴趣的文章
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>
    NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
    查看>>
    NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
    查看>>