====== Занятие I (весна 2014 г.) ======
Классы в языке Java могут быть шаблонными (generic), т.е. иметь типовые параметры. При создании объекта такого класса нужно указывать конкретные значения его типовых параметров.
Пример использования шаблонных классов: класс, предназначенный для хранения упорядоченной пары объектов
public class TwoTuple {
public final A first;
public final B second;
public TwoTuple(A a, B b) { first = a; second = b; }
public String toString() {
return "(" + first + ", " + second + ")";
}
}
Пример работы с этим классом:
TwoTuple tuple = new TwoTuple(new Integer(10), "some text");
System.out.println(tuple.toString()); // напечатается (10, some text)
===== Задание. Часть 1 =====
Приведем одну из возможных реализаций двусвязного списка:
public class MyLinkedList {
private static class Node{
E element = null;
Node next = null;
Node previous = null;
Node (E element0){
element = element0;
}
}
private Node head = null;
private Node tail = null;
private int size = 0;
public void addLast(E element){// добавляет новый элемент в конец списка
Node tmpNode = new Node(element);
if(tail == null){
head = tmpNode;
tail = head;
} else{
tail.next = tmpNode;
tmpNode.previous = tail;
tail = tmpNode;
}
}
public String toString(){// "преобразует" список в строку
if(head == null)
return null;
Node tmpNode = head;
String tmpString = "[" + tmpNode.element.toString();
while (tmpNode != tail){
tmpNode = tmpNode.next;
tmpString = tmpString.concat(", " + tmpNode.element.toString());
};
tmpString = tmpString.concat("]");
return tmpString;
}
}
Пример использования:
MyLinkedList list = new MyLinkedList();
for (int i = 0; i < 10; i++)
list.addLast(new Integer(i));
System.out.println(list.toString());// напечатается [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Реализуйте следующие методы:
- Добавление нового элемента в начало списка.
- Удаление первого/последнего элемента.
- Получение значения первого/последнего элемента.
- Получение размера списка.
- Получение значения ''i''-го элемента списка.
- Удаление ''i''-го элемента списка.
===== Задание. Часть 2 =====
С помощью получившегося двусвязного списка напишите решение задачи Иосифа Флавия (описание задачи см. в следующей [[http://home.gwu.edu/~maxal/josephus.pdf|статье]] на стр. 1).
==== Примеры для проверки работы программы ====
Далее считаем, что ''n'' - число человек, ''m'' - шаг считалки, J(n,m) - искомое значение.
* J(n,2) = 1 + 2n - 2^{1+\lfloor \log_{2} n\rfloor};
* J(10,5) = 3,\ \ J(10,7) = 9, \ \ J(10,10)=8;
* J(12,7) = 12,\ \ J(13,9) = 11.
;#;
[[java:elective|Список занятий]]
;#;