热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

给定一个没有排序的链表,去掉重复项,并保留原顺序

本文介绍了如何给定一个没有排序的链表,去掉重复项,并保留原顺序的方法。通过双层循环来实现,外层循环遍历链表,内层循环从当前外层循环的节点的后一个节点开始循环,当内层循环发现与外层当前节点相同的数据时,删除当前节点,当前节点后移。否则前驱节点和当前节点后移。继续遍历。另外还介绍了使用递归法删除重复节点的方法。

1.问题

   给定一个没有排序的链表,去掉起重复项,并保留原顺序,原链表1---3---1--5---5--7      去掉重复项之后,变为1--3---5---7

 2 思路分析(循序删除)

    通过双层循环来实现

  1) 外层循环遍历链表

  2)内层循环从当前外层循环的节点的后一个节点开始循环

  3)内层循环需要定义一个前驱辅助指针,和当前节点  

 4)当内层循环发现与外层当前节点相同的数据时,  前驱节点的后继指针    指向  当前节点的后继指针,(删除当前节点),当前节点后移。否则前驱节点和当前节点后移。继续遍历

3代码实现


package linkedlist.quchong;public class remove {public static void main(String[] args) {int i=1;//头结点LNode head=new LNode();head.next=null;LNode tmp=null;LNode cur=head;for (;i<7;i++){tmp=new LNode();if (i%2==0){tmp.date=i+1;}else if (i%3==0){tmp.date=i-2;}else {tmp.date=i;}tmp.next=null;cur.next=tmp;cur=tmp;}System.out.println("删除重复节点之前");for (cur=head.next;cur!=null;cur=cur.next){System.out.print(cur.date+" ");}removeDup(head);System.out.println("删除重复节点之后");for (cur=head.next;cur!=null;cur=cur.next){System.out.print(cur.date+" ");}}public static void removeDup(LNode head){if (head==null || head.next==null){return;}LNode outcur=head.next;//用于外层循环,指向链表的第一个节点LNode innercur=null;//用于内层循环 用来遍历 outcur 之后的节点LNode innerpre=null;//内层的前驱节点for (;outcur!=null;outcur=outcur.next){for (innercur=outcur.next,innerpre=outcur;innercur!=null;){if (innercur.date==outcur.date){innerpre.next=innercur.next;innercur=innercur.next;//后移}else {innerpre=innercur;innercur=innercur.next;}}}}
}
class LNode{LNode next;int date;
}

4 方法二:递归法


private static LNode removeDupRecursion(LNode head){if (head.next==null){return head;}LNode pointer=null;LNode cur=head;//对以head.next为首的子链表删除重复节点head.next=removeDupRecursion(head.next);pointer=head.next;//找出以head.next为首的子链表中与head节点相同的节点,并删除while (pointer!=null){if (head.date==pointer.date){cur.next=pointer.next;pointer=cur.next;}else {pointer=pointer.next;cur=cur.next;}}return head;}//对带头结点的单链表删除重复节点的输入参数public static void removeDup1(LNode head){if (head==null){return;}head.next=removeDupRecursion(head.next);}

  

     


推荐阅读
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • andr ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
author-avatar
百变精灵_tb
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有