Всем добрый вечер. Прошу помощи в таком вопросе: у меня есть LinkedList с реализованными в нем методами, не получается реализовать 3 метода: public boolean remove(int index) - удаление элемента по индексу; public boolean removeElement(int element) - удаление самого элемента и public void set(int index, int element) - замена элемента. Помогите кто чем может, заранее благодарен.
package com.inguarus;
public class IntLinkedList extends BaseList implements IntList {
private Node first;
private Node last;
private static class Node {
int element;
Node next;
Node previous;
public Node(int element) {
this.element = element;
}
}
@Override
public void add(int element) {
Node newNode = new Node(element);
if (first == null) {
newNode.next = null;
newNode.previous = null;
first = newNode;
last = newNode;
} else {
last.next = newNode;
newNode.previous = last;
last = newNode;
}
size++;
}
@Override
public void add(int index, int element) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node newNode = new Node(element);
if (index == 0) {
add(element);
}
if (index == size) {
last.next = newNode;
last = newNode;
}
Node oldNode = first;
for (int i = 0; i < index; i++) {
oldNode = oldNode.next;
}
Node oldPrevious = oldNode.previous;
oldPrevious.next = newNode;
oldNode.previous = newNode;
newNode.previous = oldPrevious;
newNode.next = oldNode;
size++;
}
@Override
public void clear() {
first = null;
last = null;
size = 0;
}
@Override
public boolean contains(int element) {
for (int i = 0; i < size; i++) {
if (get(i) == element) {
return true;
}
}
return false;
}
@Override
public int get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node result = first;
for (int i = 0; i < index; i++) {
result = result.next;
}
return result.element;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean remove(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException();
}
return false;
}
@Override
public boolean removeElement(int element) {
return false;
}
@Override
public void set(int index, int element) {
}
}
Реализовал нужные мне методы с помощью дополнительных методов:
public boolean remove(int index) {
if (index < 0 || index > size - 1) {
throw new IllegalArgumentException();
}
if (index == 0) {
first = first.next;
} else {
Node node = findNodeBeforeByIndex(index);
Node tmp = findByIndex(index);
node.next = tmp.next;
}
size--;
return false;
}
public boolean removeElement(int element) {
if (size == 0) {
return false;
} else if (size == 1) {
first = null;
last = null;
size = 0;
return true;
}
Node nodeBefore = findNodeBefore(element);
if (nodeBefore.element == 0) {
first = first.next;
size--;
return true;
} else if (nodeBefore != null) {
if (last.element == element) {
nodeBefore.next = null;
last = nodeBefore;
} else {
nodeBefore.next = nodeBefore.next.next;
}
size--;
return true;
}
return false;
}
private Node findByIndex(int index) {
if (index < 0 || index > size - 1) {
throw new IndexOutOfBoundsException();
}
int tmpIndex = 0;
if (first == null) {
throw new IndexOutOfBoundsException();
}
if (index == 0) {
return first;
}
Node node = first;
while (node.next != null) {
node = node.next;
tmpIndex++;
if (tmpIndex == index) {
return node;
}
}
throw new IndexOutOfBoundsException();
}
private Node findNodeBefore(int value) {
if (first.element == value) {
return new Node();
}
Node node = first;
while (node.next != null) {
if (node.next.element == value) {
return node;
}
node = node.next;
}
return null;
}
private Node findNodeBeforeByIndex(int index) {
if (index <= 0 || index > size - 1) {
return null;
}
int count = 0;
Node node = first;
while (node.next != null) {
if (count == index - 1) {
return node;
}
count++;
node = node.next;
}
return null;
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости