当前位置:  编程技术>java/j2ee

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

    来源: 互联网  发布时间:2014-10-28

    本文导语:  如果不能使用临时缓存,你怎么编码实现? 代码如下:方法一:不使用额外的存储空间,直接在原始链表上进行操作。首先用一个指针指向链表头节点开始,然后遍历其后面的节点,将与该指针所指节点数据相同的节点删除。...

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

代码如下:

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

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

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Base64编码原理详解及c++编码解码实现
  • 弱弱的问一下如何用openssl进行base64编码和解码的代码实现
  • python实现批量转换文件编码(批转换编码示例)
  • Unix下Unicode编码和gb的转化如何实现?急!!
  • 想在linux下实现用v4l捕获摄像头数据再用ffmpeg编码为h.264格式
  • 需要从数据库中动态生成的页面是该在SERVLET输出生成,还是应该在JSP编码实现?
  • Java IO文件编码转换实现代码
  • Asp.Net中的字符串和HTML十进制编码转换实现代码
  • php编码转换 实现gbk编码转换为utf8
  • php实现utf-8与gb2312的url编码转换
  • shell实现字符编码转换工具分享
  • C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)
  • 利用c语言实现卷积码编码器示例
  • php文件编码批量转换实现代码
  • php实现文件编码批量转换
  • Asp.Net中的字符串和HTML十进制编码转换实现代码 iis7站长之家
  • Java字符编码解码的实现详解
  • UTF-8编码内实现繁简转换的php类
  • java命名空间javax.print类docflavor的类成员方法:默认编码和平台编码定义及介绍
  • 求救:JAVA 中汉字编码怎样变成 VC 下的汉字编码?
  • 中文汉字编码知识及各种中文编码对应的编码区间总结
  • aix socket进程为何收到客户端的编码都是ISO-8859-1编码?
  • Python获取网页编码的方法及示例代码
  • iconv可以用来转换文字编码,有没有可以用来识别编码的?
  • MyEclipse如何查看和设置文件编码格式相关操作
  • 怎么把字符串转为:unicode 编码?又如何把unicode编码转为字符串(有中文)?
  • Python3中内置类型bytes和str用法及byte和string之间各种编码转换
  • 谁能给我讲讲UNIX下编码与编码设置与编码转化问题。。。
  • Linux/CentOS/fedora下vim显示的字符编码设置
  • 在jsp中如何判断传来的字符串是8859-1编码还是gb2312编码方式
  • 文件编码及UTF-8、BOM、0XFEFF相关问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3