Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 31.01.2013, 19:16   #1
KatCH
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 54
По умолчанию Удалить элемент списка

Доброго времени суток!
Я пробую реализовать двунаправленный список и все вообщем то Оk, но уж полностью запутался, как метод удаления сделать, помогите кусочком кода пожалуйста:
Код:
class IntList {
    
  static class ListItem{
       int item;
       ListItem next;
       ListItem prev;
       
      public ListItem(int item, ListItem prev, ListItem next){
           this.item = item;
           this.prev = prev;
           this.next = next;
           
       }
   }
   int count = 0;
   ListItem first;
   ListItem last;
   
   public IntList() {}
   public IntList(final IntList src){
       addLast(src);
   }
   
   public void ShowList(final IntList src){
       System.out.println("****Содержимое списка****");
       for(ListItem cur = src.first; cur!=null; cur = cur.next){
            System.out.println(cur.item);
       }   
   }
   
   public void addLast(final IntList src){
       for(ListItem cur = src.first; cur!=null; cur=cur.next)
           addLast(cur.item);
   }
   
   public void addLast(int item){
       ListItem newItem = new ListItem(item, null, null);
       
       if(last==null){
           first = newItem;
       }else{
           newItem.prev = last;
           last.next = newItem;
           
           count++;
       }
       
       last = newItem;
   }
   
   public void addFirst(int item){
       ListItem newItem = new ListItem(item, null, first);
       
       if(first==null){
           last = newItem;
       }
       else {
           first.prev = newItem;
       }
       
       first = newItem;
       
       count++;
   }
   
   public boolean remove( ){
      
       return true;
   }
   
   public int getCount(){
       return count;
   }
}
KatCH вне форума Ответить с цитированием
Старый 31.01.2013, 21:16   #2
DmitriB
Пользователь
 
Регистрация: 31.01.2013
Сообщений: 12
По умолчанию

Что-то я у вас в коде не понимаю. Метод addLast - по идее, должен быть для добавления элемента в конец списка? Так зачем же тогда куча этих операций - просто в создаете новый элемент, в нем prev на ваш last элемент, а в элементе last.next = тот новый созданный элемент.

А для удаления, если удаление по значению, то сначала производите поиск, потом для найденного элемента ListItem n, к n.prev присваиваете n.next; а к n.next.prev присваиваете n.prev; ну и текущий n в null.
DmitriB вне форума Ответить с цитированием
Старый 31.01.2013, 21:57   #3
KatCH
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 54
По умолчанию

Цитата:
Сообщение от DmitriB Посмотреть сообщение
Что-то я у вас в коде не понимаю. Метод addLast - по идее, должен быть для добавления элемента в конец списка?
Вы попутали структуру Stack со структурой List. Стэк работает по принципу "последний вошел - первый вышел". Лист, в свою очередь, обладает возможностью добавления элементов как в начало, так и в конец
KatCH вне форума Ответить с цитированием
Старый 31.01.2013, 22:37   #4
KatCH
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 54
По умолчанию

Код:
 public boolean remove(String n){
       ListItem pred = null;
       ListItem current = first;
       
       boolean found = false;
       for (; current != null; current = current.next){
           if(current.item == n){
               found = true;
               count--;
               if(pred != null){
                   pred.next = current.next;
               }
           }else{
               pred = current;
           }
       }
       last = pred;
       return found;
   }
Вот что написал, по логике, вроде бы правильно, но не работает, не могу понять почему.
KatCH вне форума Ответить с цитированием
Старый 31.01.2013, 23:03   #5
DmitriB
Пользователь
 
Регистрация: 31.01.2013
Сообщений: 12
По умолчанию

Используйте Integer.parseInt чтобы перевести строку в число, вы сравниваете не со значением строки;

Вот так, если я не ошибаюсь, должно работать:
Код:
public boolean remove(String n) {
		       ListItem current = first;
		       
		       boolean found = false;
		       
		       for (; current != null; current = current.next) {
		           if (current.item == Integer.parseInt(n)) {
		        	   found = true;
		               
		        	   if (current.prev != null && current.next != null) {
		        		   current.prev.next = current.next;
		        		   current.next = current.prev;
		        	   }
		        	   else if (current.prev == null)
		        		   current.next.prev = null;
		        	   else if (current.next == null)
		        		   current.prev.next = null;
		        	       	   
		        	   count--;
		       }
		       
		       return found;
		   }

Последний раз редактировалось DmitriB; 31.01.2013 в 23:21.
DmitriB вне форума Ответить с цитированием
Старый 01.02.2013, 00:55   #6
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,331
По умолчанию

По логике должно быть так:
Код:
public boolean remove(final int n)
Carbon вне форума Ответить с цитированием
Старый 01.02.2013, 10:51   #7
KatCH
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 54
По умолчанию

Как не крути - не работает =(
KatCH вне форума Ответить с цитированием
Старый 01.02.2013, 15:13   #8
DmitriB
Пользователь
 
Регистрация: 31.01.2013
Сообщений: 12
По умолчанию

Вот в исходнике LinkedList
Код:
 166:     size--;
 167:     if (size == 0)
 168:       first = last = null;
 169:     else
 170:       {
 171:         if (e == first)
 172:           {
 173:             first = e.next;
 174:             e.next.previous = null;
 175:           }
 176:         else if (e == last)
 177:           {
 178:             last = e.previous;
 179:             e.previous.next = null;
 180:           }
 181:         else
 182:           {
 183:             e.next.previous = e.previous;
 184:             e.previous.next = e.next;
 185:           }
 186:       }
Я забыл в своем варианте, в строке 183 считайте, добавить поле .prev
DmitriB вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удалить элемент из массива dron-k Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 17.09.2010 16:46
Мин. элемент. односвязного списка в СИ Sultan237 Общие вопросы C/C++ 0 22.03.2010 23:24
добавить/удалить элемент Revenholm Общие вопросы C/C++ 3 13.06.2009 16:17
Выделить элемент списка Иллидан Microsoft Office Word 5 23.09.2008 08:33
помогите удалить элемент из связанного списка kermit Помощь студентам 5 13.06.2008 09:14


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840