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

如果不能使用临时缓存,你怎么编码实现?

复制代码 代码如下:

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

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;
      }
    }
 }

时间: 2024-09-19 13:38:38

编码实现从无序链表中移除重复项(C和JAVA实例)_java的相关文章

《Python Cookbook(第3版)中文版》——1.10 从序列中移除重复项且保持元素间顺序不变

1.10 从序列中移除重复项且保持元素间顺序不变 1.10.1 问题 我们想去除序列中出现的重复元素,但仍然保持剩下的元素顺序不变. 1.10.2 解决方案 如果序列中的值是可哈希(hashable)的,那么这个问题可以通过使用集合和生成器轻松解决.示例如下[1]: def dedupe(items): seen = set() for item in items: if item not in seen: yield item seen.add(item) 这里是如何使用这个函数的例子: >>

Java中使用开源库JSoup解析HTML文件实例_java

HTML是WEB的核心,互联网中你看到的所有页面都是HTML,不管它们是由JavaScript,JSP,PHP,ASP或者是别的什么WEB技术动态生成的.你的浏览器会去解析HTML并替你去渲染它们.不过如果你需要自己在Java程序中解析HTML文档并查找某些元素,标签,属性或者检查某个特定的元素是否存在的话,那又该如何呢?如果你已经使用Java编程多年了,我相信你肯定试过去解析XML,也使用过类似DOM或者SAX这样的解析器,不过很有可能你从未进行过任何的HTML解析的工作.更讽刺的是,在Jav

EXCEL中如何删除重复项

具体操作 1.为了防止数据不删除错误,我们必须对数据进行备份,就是复制一个excel文件哦. 2.现在打开要处理的excel表格,然后我们对表格专利申请数据筛选,然后排序为升序排列 如图. 3.我们先创建一个列,列名可随便取,这里输入"数值",然后编辑公式如图所示,然后应用到整列.设置数值的单元格格式为小数点10位,应用到整列.   4.我们再在数值这一列中筛选等于1.0000000000的值,结果下图所示,这些数值等于1的信息都是重复的信息,可以直接删掉,删除后只保留了一个结果.大功

LeetCode 26 Remove Duplicates from Sorted Array(从已排序数组中移除重复元素)

翻译 给定一个已排序的数组,删除重复的元素,这样每个元素只出现一次,并且返回新的数组长度. 不允许为另一个数组使用额外的空间,你必须就地以常量空间执行这个操作. 例如, 给定输入数组为 [1,1,2] 你的函数应该返回length = 2, 其前两个元素分别是1和2.它不关心你离开后的新长度. 原文 Given a sorted array, remove the duplicates in place such that each element appear only once and re

java中使用Filter控制用户登录权限具体实例_java

学jsp这么长时间,做的项目也有七八个了,可所有的项目都是用户登录就直接跳转到其拥有权限的页面,或者显示可访问页面的链接.使用这种方式来幼稚地控制访问权限.从来没有想过如果我没有登录,直接输入地址也可以直接访问用户的页面的. 在jsp中权限的控制是通过Filter过滤器来实现的,所有的开发框架中都集成有Filter,如果不适用开发框架则有如下实现方法: LoginFilter.java 复制代码 代码如下: public class LoginFilter implements Filter {

Java中三种简单注解介绍和代码实例_java

简单Java注解 JDK5提供的简单注解类型只有3个. 这三个都是用来预防错误或者进行提醒的,分别是: 1.Override 2.Deprecated 3.Suppresswarnings 需要注意,JDK5(另一个说法,Tiger)实际上并没有许多内置注解;相反,它允许核心Java支持注解特性的能力. JSR-175中严格规定它用来定义元数据功能. 需要由程序员编写自定义的注解类型,其他JSR标准也编写了一系列标准注解类型. 下面将用实例来深入讲解这三个简单注解. Override 注解 Ov

excel表格中如何删除重复项

  excel重复项删除步骤如下: 1.启动Excel 2010,打开要进行处理的工作表,或者自己建立一个. 2.选中整个表格数据区域,单击菜单栏--数据--删除重复项,接下来会弹出一个界面,勾选数据包含标题,这样删除的范围就不包括标题,而且下面的方框内可以看到标题名称而不是列A列B一类.选择筛选规则,单击确定. 3.我是按照兵科以及战法进行删除的,很明显黄盖跟黄忠必有一个需要被删除,默认的是先删除排在下面的那一个.显示处理结果. 4.简单吧,面对大量重复项的数据的表格我们也无需慌张,会了这招,

利用条件公式找出WPS表格2013中的双重重复项

  ①先选择要设置的区域范围. ②找到条件格式并打开. ③打开条件格式对话框后下拉选择公式. ④输入公式::=SUMPRODUCT(($B$2:$B$1000=$B2)*($C$2:$C$1000=$C2))>1 ⑤点击格式,选择字体颜色. ⑥点击图案,选择底纹色. ⑦设置完成后点击确定按钮. ⑧最终效果如下所示:

CareerCup之2.1无序链表删除重复元素

[题目] 原文: 2.1 Write code to remove duplicates from an unsorted linked list. FOLLOW UP How would you solve this problem if a temporary buffer is not allowed? 译文: 从一个未排序的链表中移除重复的项 进一步地, 如果不允许使用临时的缓存,你如何解决这个问题? [分析] (1)如果可以使用额外的存储空间,我们就开一个数组来保存一个元素的出现情况.