服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - JAVA教程 - 编码实现从无序链表中移除重复项(C和JAVA实例)

编码实现从无序链表中移除重复项(C和JAVA实例)

2019-10-18 12:50java教程网 JAVA教程

如果不能使用临时缓存,你怎么实现无序链表中移除重复项(?C和JAVA实例无序链表中移除重复项。

crosoft YaHei";"> 如果不能使用临时缓存,你怎么编码实现?

复制代码代码如下:


方法一:不使用额外的存储空间,直接在原始链表上进行操作。首先用一个指针指向链表头节点开始,然后遍历其后面的节点,将与该指针所指节点数据相同的节点删除。然后将该指针后移一位,继续上述操作。直到该指针移到链表。

 

void delete_duplicate1(node* head){
    node*pPos=head->next;
    node*p,*q;
    while(pPos!=NULL){//用pPos指针来指示当前移动到什么位置了
        p=pPos;
       q=pPos->next;
       while(q!=NULL){//遍历pPos后面的所有节点,找出节点值与pPos所指节点相同的节点,将其删除
            if(pPos->data==q->data){
                node*pDel=q;
                p->next=q->next;
                q=p->next;
                free(pDel);
                }
            else{
                p=q;
                q=q->next;
                }
            }
        pPos=pPos->next;
        }
}


方法二:如果允许使用额外的空间,则能通过空间换时间,来降低算法的复制度。可以使用hash表来完成,既然是面试题,我们这里可以暂时先不考虑使用hash可能带来的一些问题,先假设它是完美的。即假设它能将任意整数hash到一定范围,不会出现负数下标,不会出现hash冲突等。

复制代码代码如下:

void delete_duplicate2(node* head)
{
    node*p=head->next;
    node*q=p->next;
    memset(hash,0,sizeof(hash));
    hash[p->data]=1;//置为1,表示该数已经出现过
    while(q!=NULL){
        if(hash[q->data]!=0){
            node*pDel=q;
            p->next=q->next;
            q=p->next;
            free(pDel);
            }
        else{
            hash[q->data]=1;//置为1,表示该数已经出现过
            p=q;
            q=q->next;
            }
        }
}

 

JAVA参考代码:

复制代码代码如下:

public static void deleteDups(LinkedListNode n) {
  Hashtable table = new Hashtable();
  LinkedListNode 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;
  }
}
public static void deleteDups2(LinkedListNode head) {
    if (head == null) return;
    LinkedListNode previous = head;
    LinkedListNode current = previous.next;
    while (current != null) {
      LinkedListNode runner = head;
      while (runner != current) { // Check for earlier dups
        if (runner.data == current.data) {
          LinkedListNode tmp = current.next; // remove current
          previous.next = tmp; 
          current = tmp; // update current to next node
          break; // all other dups have already been removed
        }
        runner = runner.next;
      }
      if (runner == current) { // current not updated - update now
        previous = current;
        current = current.next;
      }
    }
 }

延伸 · 阅读

精彩推荐
  • JAVA教程了解Java多线程的可见性与有序性

    了解Java多线程的可见性与有序性

    这篇文章主要介绍了了解Java多线程的可见性与有序性,在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序...

    mseddl3882019-06-28
  • JAVA教程java登录验证码实现代码

    java登录验证码实现代码

    这篇文章介绍了java实现登录验证码:用兴趣的同学可以参考一下 ...

    java代码网4912019-10-16
  • JAVA教程Java泛型之上界下界通配符详解

    Java泛型之上界下界通配符详解

    这篇文章主要介绍了Java泛型之上界下界通配符详解,学习使用泛型编程时,更令人困惑的一个方面是确定何时使用上限有界通配符以及何时使用下限有界通...

    JAVA专栏4971970-01-01
  • JAVA教程Java实现的矩阵乘法示例

    Java实现的矩阵乘法示例

    这篇文章主要介绍了Java实现的矩阵乘法,简单描述了矩阵乘法的原理,并结合实例形式分析了java实现矩阵乘法的相关操作技巧,需要的朋友可以参考下...

    水中鱼之19994932019-06-23
  • JAVA教程Java代码重构的几种模式详解

    Java代码重构的几种模式详解

    这篇文章详细介绍了Java代码重构的几种模式,有需要的朋友可以参考一下 ...

    java技术网1812019-10-16
  • JAVA教程java单向链表的实现实例

    java单向链表的实现实例

    java单向链表的实现实例。需要的朋友可以过来参考下,希望对大家有所帮助 ...

    java技术网3462019-10-17
  • JAVA教程Spring创建Bean的6种方式详解

    Spring创建Bean的6种方式详解

    这篇文章主要介绍了Spring创建Bean的6种方式详解,本文讲解了在Spring 应用中创建Bean的多种方式,包括自动创建,以及手动创建注入方式,实际开发中可以根...

    冬眠的山谷2132019-06-25
  • JAVA教程java中ThreadPoolExecutor常识汇总

    java中ThreadPoolExecutor常识汇总

    这篇文章主要介绍了java中ThreadPoolExecutor常识汇总,线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的,需要的朋友...

    有爱jj2102019-06-25