【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

工作踩得坑之二遍历链表时删除元素

原创 2016年05月30日 21:20:26

先描述一下需求:在一个链表中删除满足条件的元素。
我当时是类似这么写的哈:
public static void main(String[] args){
List list = new ArrayList();

        list.add(3);
       Iterator<Integer> itertor = list.iterator();
        while( itertor.hasNext()){
            Integer element = itertor.next();
             if( element.equals(2)){
                  list.remove( element);
            }
       }
 }

结果:抛出ConcurrentModificationException异常。
从逻辑上来讲,这是符合的,可是怎么会抛出一个异常来。于是跟进源码:

  • 追踪源代码:list.iterator();

    public Iterator iterator() {
    return new Itr();
    }
    可见返回了一个指向Itr类型对象的引用。
    private class Itr implements Iterator {
    int cursor; // index of next element to return
    int lastRet = -1; // index of last element returned; -1 if no such
    int expectedModCount = modCount
    }

  • 执行while( itertor.hasNext())。

  • public boolean hasNext() {
    return cursor != size;
    }
    我们来看看cursor表示下一个元素索引。

    - 执行Integer element = itertor.next();

    @SuppressWarnings("unchecked")
    public E next() {
        //判断修改次数是否和期望的修改次数一致。不相等,则会抛出 throw new                                   ConcurrentModificationException();
        checkForComodification();
        int i = cursor;
        if ( i >= size)
            throw new NoSuchElementException();
        Object[] elementData = ArrayList. this. elementData;
        if ( i >= elementData. length)
            throw new ConcurrentModificationException();
        //此时cursor=1,指向下一个元素
        cursor = i + 1;
        //取出下一个元素,并且lastRet的值为0
        return (E) elementData[ lastRet = i];
    }
    
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

单链表中删除元素

设单链表的节点结构为(data,next),将指针p指向的节点删除,代码如下。(其中temp为节点类型指针,默认指向NULL) temp = p->next; p->next=temp->next;...

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

【题目】 原文: <p style="margin-top: 0px; margin-bottom: 9px; font-family: 'Hel

只允许遍历链表一遍,定位链表倒数第m个元素

最近一某大公司面试,碰到一算法类笔试题。大致要求为:输出单链表倒数第m个元素,只允许遍历链表一遍。     笔试时,我的想法是:遍历一遍链表,反转单链表,在反转链表的过程中,用一个指针数组保存当前链...
  • acs713
  • acs713
  • 2012-03-05 10:05
  • 1038

数据结构 - 如何删除单向链表的倒数第m个元素?

建立tmp,cur两个指针。先利用tmp指针从链表头开始步进m个元素,此时,使cur指针指向头节点。然后tmp,cur两个指针一起步进,当tmp-&gt;next指向链表结尾的时候,cur-&gt;next刚好指向倒数第m个元素。最后利用cur-&gt;next指针删除倒数第m个元素。

汇编语言循环遍历链表代码分析(16)

  来自于《Intel汇编语言程序设计》(第四版)第10章-----结构和宏。   首先,链表大家都不陌生,每个节点包含了一个data和一个link,其中Link指向了下一个节点的开始地址。最后一个节点的link保存的是一个空指针(NULL)。   另外本章是关于宏的,宏在汇编中的角色是非常重要的。不过以下的程序只是一个循环遍历链表的程序:     TITLE Creating a Linked List                     (List.as

初谈链表--链表的创建与增加元素删除元素,重新申请长度!

#include #include #include #include #include #include using namespace std; #define TRUE 1 #def...

《算法之美》の链表问题の记住头元素+删除元素

记住头元素: <span style

数据结构—链表-单链表应用-删除元素最大的节点

难点,当找到这个节点时,你删除他,链表链就断了,所以你不仅要找到这个最大的节点还要记录下来他的前一个节点。 用两个指针,他们相伴而行,其中一个指针指向的是要删除的节点,与此同时,要记录他的上一个节点...

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

【题目】 原文: <p style="margin-top: 0px; margin-bottom: 9px; font-family: 'Hel

《算法之美》の链表问题の记住头元素+删除元素

记住头元素:单向链表的头元素必须至始至终要记住,否则链表将会在内存中丢失。这意味着在链表第一个元素之前插入新元素或删除链表第一个元素时,指向链表头的指针或引用必须更新。在C/C++中,很容易因误用指针...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)