Реализация LinkedSet Java - PullRequest
       14

Реализация LinkedSet Java

2 голосов
/ 09 декабря 2010

Нас попросили реализовать связанный набор в Java. Ниже приведена моя попытка, в ней есть все методы, которые нас просят написать, но метод remove вызывает исключение нулевого указателя без сбоев. Попробуйте, как я мог, я не могу понять это, любая помощь высоко ценится.

import java.util.*;

class LinkedSet<T> {

 private static class Node<T> {

  private T item;
  private Node<T> next;

  Node(T item, Node<T> next) {

   this.item = item;
   this.next = next;
  }

 }


 private Node<T> head = null;
 private int numItems = 0;

 int size() {

  return (numItems);

 }

 public boolean add(T t) {

  if(contains(t)) return false;

  Node<T> newNode = new Node(t, null); //new node to be added

  if(numItems==0) {

   head = newNode;
   numItems++;
   return true;
  }

  Node<T> temp = head;

  while(temp.next != null) temp = temp.next;
  temp.next = newNode;
  numItems++;
  return true;

 }


 public boolean remove(T t) {

  if(numItems == 0) return false; //check for empty set
  //was tempted to use contains here but would have made it N^2 I think

  Node<T> p = head; //t if present
  Node<T> pPrev = null; //previous node to p

  while(p!=null && !equals(t, p.item)) {

   pPrev = p;
   p = p.next;

  }

  //t is present if node p!= null , node p != null ==> t in node p

  if(p==null) return false;
  else {

   pPrev.next = p.next; //null pointer
   numItems--;
   return true;
  }


 }

 public boolean contains(T t) {


  Node<T> temp = head;

  for(int i = 0; i < numItems; i++) {

   if(equals(temp.item, t)) return true;
   temp = temp.next;
  }

  return false;

 }

 private boolean equals(T t1, T t2) { //t1, t2 may be null

  if(t1!=null) return t1.equals(t2); //learn this
  else return t2 == null; //learn this

 }

 public static void main(String[] args) {

  LinkedSet<Integer> test = new LinkedSet<Integer>();

  test.add(1);
  test.add(2);
  test.add(3);

  for(int i = 0; i < 10; i ++) {

   System.out.println("Testing i = " + i + " - " + test.contains(i));
  }

  System.out.println(); System.out.println(); System.out.println();

  System.out.println(test.remove(1));


 }



}

Ответы [ 2 ]

5 голосов
/ 09 декабря 2010

Очевидным моментом является то, что первый элемент в списке не имеет предыдущего элемента. (Некоторые реализации связанного списка добавят фиктивную ссылку для более чистой обработки.)

1 голос
/ 09 декабря 2010

Посмотрите на эту часть кода:

  Node<T> p = head; //t if present
  Node<T> pPrev = null; //previous node to p

  while(p!=null && !equals(t, p.item)) {

   pPrev = p;
   p = p.next;

  }

Если equals(t, head.item), то pPrev == null, когда вы выйдете из цикла while и позже получите исключение нулевого указателя.

...