在index函数中删除会删除索引前的所有元素

时间:2013-08-12 06:40:33

标签: java algorithm data-structures linked-list

我使用此remove方法删除列表的第3个元素。但它删除了指定索引之前的所有元素。因此,如果Jhon,Sam,Philip,Emma是列表元素,如果我删除第3个元素,唯一剩下的元素是Nick。我该如何解决这个问题?

import java.util.*;

class List {
    Customer listPtr;
    int index;

    public void add(Customer customer) {
        Customer temp = customer;
        if (listPtr == null) {
            listPtr = temp;
            index++;
        } else {
            Customer x = listPtr;
            while (x.next != null) {
                x = x.next;
            }
            x.next = temp;
            index++;
        }
    }

    public void remove(int index) {
        int size = size();
        Customer tmp = listPtr, tmp2;
        int i = 0;
        while (i != size) {
            if ((i + 1) == index) {
                tmp2 = tmp;
                listPtr = tmp2.next;
                break;
            }
            tmp = tmp.next;
            ++i;
        }
    }

    public int size() {
        int size = 0;
        Customer temp = listPtr;
        while (temp != null) {
            temp = temp.next;
            size++;
        }
        return size;
    }

    public void printList() {
        Customer temp = listPtr;
        while (temp != null) {
            System.out.println(temp);
            temp = temp.next;
        }
    }
}

class DemoList {
    public static void main(String args[]) {
        List list = new List();
        Customer c1 = new Customer("10011", "Jhon");
        Customer c2 = new Customer("10012", "Sam");
        Customer c3 = new Customer("10013", "Philip");
        Customer c4 = new Customer("10014", "Emma");        
        list.add(c1);
        list.add(c2);
        list.add(c3);
        list.add(c4);
        list.remove(3);
        System.out.println(list.size());
        list.printList();
    }
}

class Customer {
    String id;
    String name;
    Customer next;

    public Customer(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String toString() {
        return id + " : " + name;
    }

    public boolean equals(Object ob) {
        Customer c = (Customer) ob;
        return this.id.equals(c.id);
    }
}

2 个答案:

答案 0 :(得分:2)

remove()方法存在一些问题。

首先,您应该只更改listPtr index == 0

在所有其他情况下,您需要调整node.next位置节点的index - 1

P.S。将index作为List的数据成员看起来像是一个等待发生的事故。

答案 1 :(得分:0)

public void remove(int index) {
  if (i == 0) {
      // TODO: do some checks (listPtr is set, has next...)
      listPtr = listPtr.next;
  }
  else {
      int currentIndex = 0;
      Customer currentElement = listPtr;
      while (currentIndex != size()) {
          if ((currentIndex + 1) == index) {
              currentElement.next = currentElement.next.next;
              break;
          }
          currentElement = currentElement.next;
          currentIndex++;
      }
  }
}