//结点类
public class Node {    Node next;
    Object obj;    public Node(Node node) {
        next = node;
    }    public Node(Node node, Object element) {
        next = node;
        obj = element;
    }    public Node getNext() {
        return next;
    }    public void setNext(Node node) {
        next = node;
    }    public void setElement(Object element) {
        obj = element;
    }    public Object getElement() {
        return obj;
    }    public String toString() {
        return obj.toString();
    }
}//链表类
public class Link {    Node current, head;
    int size;    public Link() {
        head = current = new Node(null);
        head.next = head;
        size = 0;
    }    public void index(int i) {
        if (i > size || i < -1) {
            System.out.println("参数错误");
        }
        if (i == -1) {
            return;
        }
        current = head.next;
        int j = 0;
        while ((current != null) && j < i) {
            current = current.next;
            j++;
        }
    }    public void insert(int i, Object element) {
        if (i > size || i < -1) {
            System.out.println("参数错误!");
        }
        index(i - 1);
        current.setNext(new Node(current.next, element));
        size++;
    }    public Object delete(int i) {
        if (size == 0) {
            System.out.println("链表中已无元素可供删除!");
        }        if (i > size || i < -1) {
            System.out.println("参数错误!");
        }        index(i - 1);
        Object element = current.next.getElement();
        current.setNext(current.next.next);
        size --;
        System.out.println("元素" + element +"已被删除");        return element;
    }    public Object getData(int i) {
        if (i > size || i < -1) {
            System.out.println("参数错误!");
        }
        index(i);
        return current.getElement();
    }    public int size() {
        return size;
    }    public boolean isEmpty() {
        return size == 0;
    }
}
//测试类//测试链表的输出和删除
public class Tester1 {
    public static void main(String[] args){
        Link link = new Link();
        int n = 10;
        for(int i=0; i<n; i++){
            link.insert(i, new Integer(i+1));   //插入元素
        }
        
        for(int k=0; k<link.size; k++){
            System.out.print(link.getData(k) + " ");    //输出插入的元素
        }        System.out.println();        link.delete(4);      //删除第四个结点,为什么当此句存在时,元素值为6的结点无法删除?????????????????????????????        for(int k=0; k<link.size; k++){
            System.out.print(link.getData(k) + " ");    //输出插入的元素
        }        System.out.println();
        
       for(int i=0; i<link.size; i++){
           if(Integer.parseInt(link.getData(i).toString()) % 2 == 0){
               link.delete(i);      
           }
       }
         System.out.println("元素值为偶数的结点已被删除!");
        
        for(int j=0; j<link.size; j++){
            System.out.print(link.getData(j) + " ");
        }
        System.out.println();
    }
}
//link.delete(4);      //删除第四个结点,为什么当此句存在时,元素值为6的结点无法删除?????????????????????????????
//小白求解!!!!!

解决方案 »

  1.   

    调了下,原来是这里问题:for(int i=0; i<link.size; i++){
      if(Integer.parseInt(link.getData(i).toString()) % 2 == 0){
      link.delete(i);   
      }你这个for的停止条件,是link.size,如果在迭代的过程中列表的大小发生了变化,就可能会出现迭代次数变多或者变少,导致迭代的结果不对,所以java的集合类推荐使用Iterator迭代,如果在迭代过程中改变了迭代集合的大小,就会抛出迭代不一致的异常,这样可以在最大程度上减少程序出错的可能。
    所以这里强烈推荐你实现Iterator接口来迭代,更加安全。修改成如下代码结果即正确:int size = link.size;
    for(int i=0; i<size; i++){
      if(Integer.parseInt(link.getData(i).toString()) % 2 == 0){
      link.delete(i);   
      }
    PS:另外,公开成员变量也是java不推荐的,应该使用getter和setter.