2019独角兽企业重金招聘Python工程师标准>>>

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

要想移除链表中的重复节点,我们需要设法记录有哪些是重复的。这里只需要使用到一个简单的散列表。

在下面的解法中,我们会直接迭代访问整个链表,将每个节点加入到散列表。若发现有重复的元素,将该节点从链表中移除,然后继续迭代。这个题目使用了链表,因此只需要扫描一次就能搞定。

deleteDups()的时间复杂度为O(N),其中N为链表节点数目。

解法二:不使用缓冲区

如不借助额外的缓冲区,可以用两个指针来迭代:current迭代访问整个链表,runner用于检查后续的节点是否重复

上述代码中的deleteDups2()

该代码的空间复杂度为O(1),时间复杂度为O(N2)

package cglib;
import java.util.Hashtable;

class LinkedListNode<T> {
    public LinkedListNode<T> next;
    public T data;

public LinkedListNode(Object object, int data2, Object object2) {
           
    }
      
    }

public class StringNumber {
    private LinkedListNode<Integer> head;  
    private LinkedListNode<Integer> tail;  
    private int size;  
      
     // 尾部插入    
    public boolean addTail(int data) {   
        if (this.head == null) {   
            this.head = new LinkedListNode<Integer>(null, data, null);   
            this.tail = this.head;   
        } else {   
            LinkedListNode<Integer> newnode = new LinkedListNode<Integer>(this.tail, data, null);   
            this.tail.next = newnode;   
            this.tail = newnode;   
        }   
        this.size++;   
         
        return true;   
    }   
    public String toString() {   
        if (this.isEmpty())   
            return "[]";   
        else {   
            StringBuffer st = new StringBuffer("[");   
            for (LinkedListNode<Integer> curent = this.head; curent != null; curent = curent.next)   
                st.append(curent.data.toString() + " ,");   
            st.append("]");   
            return st.toString();   
        }   
    }   
    public boolean isEmpty() {   
        return this.size == 0;   
    }   
 
    public void deleteDups(LinkedListNode<Integer> n){  
        Hashtable<Integer, Boolean> table = new Hashtable<Integer, Boolean>();  
        LinkedListNode<Integer> previous = null;  
        while(n != null){  
            if(table.containsKey(n.data)){  
                previous.next = n.next;  
            }else{  
                table.put(n.data, true);  
                previous = n;  
            }  
            n =n.next;  
        }  
        while(head!=null){  
            System.out.println(head.data.toString());  
            head= head.next;  
        }  
    }  
    public void deleteDups2(LinkedListNode<Integer> head){  
        if(head == null)  
            return;  
        LinkedListNode<Integer> current = head;  
        while(current != null){  
            //移除后续值相同的所有节点  
            LinkedListNode<Integer> runner = current;  
            while(runner.next != null){  
                if(runner.next.data == current.data){  
                    runner.next = runner.next.next;  
                }else{  
                    runner = runner.next;  
                }  
            }  
            current= current.next;  
        }  
        while(head!=null){  
            System.out.println(head.data.toString());  
            head= head.next;  
        }  
    }  
    public static void main(String[] args){  
          
        StringNumber test = new StringNumber();  
        test.addTail(1);  
        test.addTail(2);  
        test.addTail(3);  
        test.addTail(3);  
        test.addTail(4);  
        test.addTail(1);  
          
        test.deleteDups2(test.head);  
          
    }
    
}

  1. public static void deleteDups(LinkListNode n) {
  2. LinkListNode previous = null;
  3. Hashtable table = new Hashtable();
  4. while(n != null){
  5. if (table.containsKeys(n.data)) {
  6. preious.next = n.next;
  7. }
  8. else {
  9. table.put(n.data, true);
  10. previous = n;
  11. }
  12. n = n.next;
  13. }
  14. }
  1. public static void deleteDupsNew(LinkListNode head) {
  2. if (head == null) return;
  3. LinkListNode current = head;
  4. while(current != null){
  5. LinkListNode runner = current;
  6. while (runner.next != null){
  7. if(runner.next.data == current.data){
  8. runner.next = runner.next.next;
  9. }
  10. else{
  11. runner = runner.next;
  12. }
  13. }
  14. current = current.next;
  15. }
  16. }

或者:

public class ListNote {private  ListNote NextNote;private int value;public ListNote(){  }public ListNote(int value){this.value=value;}  public  ListNote getNext(){     return NextNote;            }public void setNext(ListNote next){this.NextNote=next; }   public int getValue(){return value;   }public void setValue(int value){this.value=value;}
}
public static void deleteDuplication(ListNote root){if(root==null){return;}ListNote preNode=null;//前结点ListNote node=root;//当前结点while(node!=null){ListNote nextNode=node.getNext();//下一个结点boolean needDelete=false;
//判断当前结点和下一个结点值是否相等 if(nextNode!=null&&nextNode.getValue()==node.getValue())needDelete=true;if(!needDelete){//不相等,向前移动preNode=node;node=node.getNext();            }else{//相等,删除该结点int value=node.getValue();ListNote toBeDel=node;while(toBeDel!=null&&toBeDel.getValue()==value){nextNode=toBeDel.getNext();//删除该结点toBeDel=nextNode;}  if(preNode==null){//头结点删除时root=nextNode;}else{//即删除了重复结点preNode.setNext(nextNode);}node=nextNode;}}}

转载于:https://my.oschina.net/u/2822116/blog/788183

编写代码,移除未排序的链表中的重复节点相关推荐

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

    移除重复节点 难度简单97 编写代码,移除未排序链表中的重复节点.保留最开始出现的节点. 示例1: 输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3] 示例2: 输入:[1, 1, 1 ...

  2. 移除未排序链表中的重复节点,保留最开始出现的节点

    编写代码,移除未排序链表中的重复节点.保留最开始出现的节点. 示例1: 输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3] 示例2: 输入:[1, 1, 1, 1, 2]输出:[1, ...

  3. C语言从已排序的链表中删除重复项(附完整源码)

    C语言从已排序的链表中删除重复项 C语言从已排序的链表中删除重复项完整源码(定义,实现,main函数测试) C语言从已排序的链表中删除重复项完整源码(定义,实现,main函数测试) #include ...

  4. 删除单链表中的重复节点(c语言版本)

    这是一道经典的面试题,下面是我的研究和举一反三,特整理如下: 分为三种情形: (1)删除有序链表的重复节点,重复节点一个都不留 (2)删除有序链表的重复节点,重复节点只留一个 (3)删除无序链表的重复 ...

  5. 删除单链表中的重复节点

    删除单链表中的重复节点 一.题目描述 已知单链表L,写一算法,删除其中的重复节点.(更好的阅读体验,请访问程序员在旅途) 二.分析解答 2.1 知识点分析 本题主要考察链表的相关知识点,其中包括:单链 ...

  6. 每天一道LeetCode-----移除有序链表中的重复节点

    Remove Duplicates from Sorted List 原题链接Remove Duplicates from Sorted List 给定一个有序链表,对于链表中所有重复元素,只保留一个 ...

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

    class Solution { public ListNode removeDuplicateNodes(ListNode head) { Set set = new HashSet<> ...

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

    class Solution { public:ListNode* removeDuplicateNodes(ListNode* head) {ListNode *p=head;ListNode *q ...

  9. 老虎-删除排序链表中的重复节点

    题目:1-1-2-3-3-3-4-5-6-6-7,删除重复节点后返回2-4-5-7 def delete_duplicate(head):h = Node(0)k = hp = headif not ...

最新文章

  1. UVa11300 Spreading the Wealth(数学问题)
  2. 机器学习排序之Learning to Rank简单介绍
  3. android的三个基础控件,Android基础控件——ProgressBar自定义的介绍、动画效果实现、附加三个漂亮的进度条...
  4. 数学图形之SineSurface与粽子曲面
  5. 从零开始nodejs系列文章
  6. oc 实例变量可见度、方法
  7. 百度机器同传技术及应用小记
  8. Linux操作系统使用基础05:Linux磁盘与文件系统管理
  9. SC命令---安装、开启、配置、关闭windows服务 bat批处理(转载)
  10. 完美解决:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求...
  11. 【优化模型】推销员问题模型
  12. python求斜率_python – 在曲线上找到斜率变化的位置
  13. 【BZOJ1062】糖果雨(NOI2008)-数形结合+二维树状数组
  14. 腾讯 Techo Hub 2022 年首站落地福州|723,与开发者们探讨工业数字化!
  15. java 线框图_你真的搞懂什么是线框图,什么是原型图了吗?
  16. 第一讲:计算机基本结构
  17. 【MMDetection3D】MVXNet踩坑笔记
  18. 光栅原理及其c语言仿真,光栅原理及MATLAB仿真
  19. TCP-IP详解卷1-3分享
  20. BRDF·基于物理的着色技术学习总结

热门文章

  1. 物联网技术周报第 145 期: ESP8266 和 IFTTT 自制 WiFi 智能秤
  2. Java关键字——instanceof
  3. 【深入剖析Tomcat笔记】第一篇 基础知识储备
  4. 调用ajax后页面为什么会刷新,为什么页面在JQuery ajax调用之后重新加载?
  5. AWS — AWS Direct Connect
  6. 分布式消息队列 — RabbitMQ(3)
  7. 安卓蓝牙调试软件和微信小程序搜索不到设备
  8. 扩展屏幕没有连接,但程序窗口还在扩展屏幕上,在看不到这个屏幕的情况下,把程序窗口拉回来的方法
  9. 大型互联网b2b b2c o2o电子商务云平台
  10. 史上第二走心的 iOS11 Drag Drop 教程