2015-10-23 5 views
0

Я пытаюсь написать функцию delete(), которая берет связанный список и удаляет элемент Kth из списка. Мой код ниже.Как удалить первый элемент в связанном списке?

public void delete(int k){ 
    Node current = head; 
    for (int i = 0; i < k; i++){ 
     if(current == null || current.next == null){ //check if list is empty or k is out of bounds 

      throw new IndexOutOfBoundsException(); 
      } 
     else 
     { 
      current = current.next; // Move pointer to k position 
     } 
    } 
    remove(current.item); 
    N--; 
    } 

public void remove(E e) { 
if (e == null) 
    throw new NullPointerException(); 

// (*) special case (2/one node with e) 
if (head != null && head.item.equals(e)) { 
    head = null; 
    N--; 
} 
else { // (*) general case (3) -- this also covers the case for empty list 
    Node temp; 
    // Step 1: bring temp to one node before the node with e. 
    for (temp = head; temp != null && !temp.next.item.equals(e); 
     temp = temp.next) {} // empty body 
    // Step 2: if temp is still in the list, then remove 
    if (temp != null) { 
    temp.next = temp.next.next; 
    --N; 
    } 
} 

}

Пока мой код работает, как ожидалось, когда я запускаю команду, как lst1.delete(1) или lst1.delete(2) в основном. Однако, когда я запускаю lst1.delete(0), он удаляет весь связанный список. Я не могу понять, почему lst1.delete(0) удаляет весь связанный список, но я думаю, что это имеет какое-то отношение к for-loop. Цикл for - петли вверх, пока не будет меньше k. Если я пройду в 0, то, возможно, он удалит точку входа главы, которая удаляет весь список?

Мой вопрос: может ли кто-нибудь рассказать мне, как я могу изменить свой код, чтобы при запуске lst1.delete(0) он просто удалял первый элемент в связанном списке, а не весь связанный список?

+0

Когда вы запустите lst1.delete (1), как долго находится оставшийся список? Думаю, только один элемент? Если это так, то удаление всего из головы приведет к удалению всего списка. – brianestey

+0

Обновлено, чтобы показать, что происходит в 'remove'. @brianestey, когда я запускаю lst1.delete (1), он удаляет элемент в позиции 1 в связанном списке. Остальные предметы остаются. Таким образом, количество оставшихся элементов в связанном списке просто уменьшается на единицу. –

+0

'head = null' выглядит подозрительно. Это не просто, если есть один элемент, это если вы удаляете первый элемент. – brianestey

ответ

0

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

public void delete(int k){ 
    //instance variable 
    Node current = head; 

    if(current == null || current.next == null){ //check if list is empty 

     throw new NullPointerException(); 
     } 

    if (k < 0 || k >= size()){     // check if k is out of bounds 

     throw new IndexOutOfBoundsException(); 
     } 

    if (k == 0){        // this handles k = 0 condition 
     head = head.next; 
    } 

    else 

    for (int i = 0; i < k-1; i++){    // otherwise, if K != 0, 
     current = current.next;     // move pointer to k position 

    } 

    if (current != null) { 
     current.next = current.next.next; 
    } 

    N--; 

    } 

Это дало мне результат, на который я надеялся.

0

Это должно исправить вашу проблему. Вы настраиваете

head = null; 

если деталь удалить это голова, но то, что вы должны сделать, это,

if(head.next() != null) { 
    head = head.next(); 
} 
else { 

    head = null; 
} 

Это укажут голова к голове + 1 пункт, если голова не является единственным в списке. в этом случае мы должны установить head в null.

public void delete(int k) { 

    Node current = head; 

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

     if(current == null || current.next == null) { //check if list is empty or k is out of bounds 

      throw new IndexOutOfBoundsException(); 
     } 
     else { 

      current = current.next; // Move pointer to k position 
     } 
    } 

    remove(current.item); 

    N--; 
} 

public void remove(E e) { 

    if (e == null) { 

     throw new NullPointerException(); 
    } 

    // (*) special case (2/one node with e) 
    if (head != null && head.item.equals(e)) { 

     //Your issue was here 
     if(head.next() != null) { 

      head = head.next(); 
     } 
     else { 

      head = null; 
     } 

     N--; 
    } 
    else { // (*) general case (3) -- this also covers the case for empty list 

     Node temp; 

     // Step 1: bring temp to one node before the node with e. 
     for (temp = head; temp != null && !temp.next.item.equals(e); 

      temp = temp.next) {} // empty body 

      // Step 2: if temp is still in the list, then remove 
      if (temp != null) { 

       temp.next = temp.next.next; 
        --N; 
      } 
     } 
    } 
} 
+0

Что вы изменили? –

+0

см. Комментарий в head = head.next(); –

0

Вы проблема здесь

if (head != null && head.item.equals(e)) { 
    head = null; 
    N--; 
} 

если вы используете lst1.delete(0) тогда head.item.equals(e) стать правдой, как вы проходите head к remove(). Затем все ваши ссылки удалены.

Одно исправление будет

if (head != null && head.item.equals(e)&&head.next==null) { 
    head = null; 
    N--; 
} 

Здесь дополнительная проверка head.next==null убедитесь, что там есть только один элемент в связанном списке.

0

1) удалить (0). delete никогда не входит в цикл, потому что i меньше k истинно сразу. Таким образом, вы удаляете head.item. 2) Затем удалите специальный корпус 2 набора head = null.

Это 2 ошибки. Не обижайтесь, но ваш код беспорядок. Сядьте с диаграммами и попробуйте снова озадачить его с нуля. Кто-то другой сделает это за вас, не научит вас ничего, кроме как рано отказаться от проблемы программирования.

+0

Благодарим вас за помощь! Как упоминалось выше, я не писал метод remove(). Этот метод был написан моим профессором, и я должен создать вокруг него метод delete(). Я предположил, что это написано правильно, но, возможно, профессор сделал ошибку –

+2

Профессора совершают ошибки. Они могут быть небрежными или спешащими. Назовите это красиво, если ваш профессор будет порядочным, и вы будете замечены в хорошем смысле. – Sammy

0

Эта причина объясняется тем, что при k = 0 петля никогда не вводится. В результате current не обновляется, чтобы указать на правый.

Смежные вопросы