Реалізація LinkedList у Java
Настав час випробувати себе у виконанні дійсно складних завдань.
Ми реалізуємо нашу спрощену структуру даних — а саме, SinglyLinkedList.
Почнемо з реалізації класу Node, який зберігатиме значення та посилання на наступний Node.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
Реалізація класу Node у SinglyLinkedList вже була продемонстрована в попередньому розділі, тому детально на цьому зупинятися не будемо.
Далі створимо клас SinglyLinkedList, у якому визначимо всю логіку для нашої структури даних:
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Ми створили поле Node head, яке зберігатиме перший елемент нашої структури даних.
У звичайному LinkedList також є head і tail, які зберігають перший і останній елементи структури даних. Оскільки під час ініціалізації структура даних повинна бути порожньою, це поле встановлюється у null у конструкторі.
Наша структура даних повинна підтримувати всі операції CRUD.
Створення
Розглянемо покроково написання методу для додавання елемента в кінець списку, що відповідає операції створення (Create):
SinglyLinkedList.java
12345678910111213141516171819202122public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } public void append(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; return; } Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } }
Вище наведено реалізацію методу для додавання елемента в кінець списку. Розглянемо, як працює цей метод:
-
Створюється об'єкт класу
Node—newNode, який ініціалізується через конструктор із передачеюdataз параметрів методуappend(); -
Далі перевіряється, чи список порожній. Якщо так, перший елемент списку (
head) замінюється наnewNodeшляхом переприсвоєння; -
Потім додається оператор
returnдля виходу з методу; -
Якщо список не порожній, у цьому методі створюється новий об'єкт
current, який представляєNode headу цьому контексті; -
За допомогою циклу
whileпроходимо по всьому списку, покиcurrent.nextне станеnull, тобто поки не визначимо, що наступний елемент у списку відсутній; -
Коли знаходиться останній непорожній елемент у списку, його посилання встановлюється на
newNode, таким чином елемент додається до списку.
Іншими словами, мета методу append — встановити посилання останнього елемента на новий елемент. Таким чином, новий елемент додається до списку.
Читання
Переходимо далі; тепер необхідно реалізувати операцію читання.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
Операція читання є досить простою. Необхідно проітерувати кожен елемент списку та вивести їх на екран. У нашому випадку також використовується змінна
current, яку ініціалізуємо якNode head; -
Далі встановлюємо умову для циклу while як
current != nullі виводимо полеdataна екран; -
Для ітерації по списку використовуємо зміну посилання шляхом переназначення
current, що виглядає якcurrent = current.next;; -
Це виконується до тих пір, поки
Node currentне стане порожнім. Після цього виходимо з циклу та переходимо до наступного рядка.
До речі, подумайте, як можна замінити цей цикл while на цикл do-while. Чи можливо це взагалі?
Оновлення
Тепер перейдемо до методу оновлення, який є цікавішим у своїй реалізації:
SinglyLinkedList.java
12345678910111213public void update(int index, int newData) { if (index < 0 || index >= size()) { System.out.println("Invalid index"); return; } Node current = head; for (int i = 0; i < index; i++) { current = current.next; } current.data = newData; }
-
Спочатку перевіряємо, чи знаходиться цей
indexу нашому списку за допомогою оператораif. Якщо ні, виводимо повідомлення "Invalid index" і завершуємо виконання методу. Це робиться для уникнення помилок; -
Якщо індекс знаходиться в межах нашого списку, переходимо до знайомого алгоритму. Спочатку створюємо об'єкт класу
Nodeз назвоюcurrent, який ініціалізуємо якhead; -
Замість циклу
whileвикористовуємо циклfor, який тут більш доречний, оскільки ми знаємо точну кількість ітерацій, яку потрібно виконати. Кількість ітерацій дорівнює значенню параметраindex; -
Наш цикл виглядає так:
for (int i = 0; i < index; i++). У цьому циклі знаходимо потрібний елемент за допомогою знайомої операції:current = current.next; -
Коли знайдено потрібний елемент, присвоюємо його атрибуту
dataнове значення, виконуючи операціюcurrent.data = newData. ЗначенняnewDataберемо з параметрів цього методу.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Чудово!
Completion показник покращився до 4
Реалізація LinkedList у Java
Свайпніть щоб показати меню
Настав час випробувати себе у виконанні дійсно складних завдань.
Ми реалізуємо нашу спрощену структуру даних — а саме, SinglyLinkedList.
Почнемо з реалізації класу Node, який зберігатиме значення та посилання на наступний Node.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
Реалізація класу Node у SinglyLinkedList вже була продемонстрована в попередньому розділі, тому детально на цьому зупинятися не будемо.
Далі створимо клас SinglyLinkedList, у якому визначимо всю логіку для нашої структури даних:
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Ми створили поле Node head, яке зберігатиме перший елемент нашої структури даних.
У звичайному LinkedList також є head і tail, які зберігають перший і останній елементи структури даних. Оскільки під час ініціалізації структура даних повинна бути порожньою, це поле встановлюється у null у конструкторі.
Наша структура даних повинна підтримувати всі операції CRUD.
Створення
Розглянемо покроково написання методу для додавання елемента в кінець списку, що відповідає операції створення (Create):
SinglyLinkedList.java
12345678910111213141516171819202122public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } public void append(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; return; } Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } }
Вище наведено реалізацію методу для додавання елемента в кінець списку. Розглянемо, як працює цей метод:
-
Створюється об'єкт класу
Node—newNode, який ініціалізується через конструктор із передачеюdataз параметрів методуappend(); -
Далі перевіряється, чи список порожній. Якщо так, перший елемент списку (
head) замінюється наnewNodeшляхом переприсвоєння; -
Потім додається оператор
returnдля виходу з методу; -
Якщо список не порожній, у цьому методі створюється новий об'єкт
current, який представляєNode headу цьому контексті; -
За допомогою циклу
whileпроходимо по всьому списку, покиcurrent.nextне станеnull, тобто поки не визначимо, що наступний елемент у списку відсутній; -
Коли знаходиться останній непорожній елемент у списку, його посилання встановлюється на
newNode, таким чином елемент додається до списку.
Іншими словами, мета методу append — встановити посилання останнього елемента на новий елемент. Таким чином, новий елемент додається до списку.
Читання
Переходимо далі; тепер необхідно реалізувати операцію читання.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
Операція читання є досить простою. Необхідно проітерувати кожен елемент списку та вивести їх на екран. У нашому випадку також використовується змінна
current, яку ініціалізуємо якNode head; -
Далі встановлюємо умову для циклу while як
current != nullі виводимо полеdataна екран; -
Для ітерації по списку використовуємо зміну посилання шляхом переназначення
current, що виглядає якcurrent = current.next;; -
Це виконується до тих пір, поки
Node currentне стане порожнім. Після цього виходимо з циклу та переходимо до наступного рядка.
До речі, подумайте, як можна замінити цей цикл while на цикл do-while. Чи можливо це взагалі?
Оновлення
Тепер перейдемо до методу оновлення, який є цікавішим у своїй реалізації:
SinglyLinkedList.java
12345678910111213public void update(int index, int newData) { if (index < 0 || index >= size()) { System.out.println("Invalid index"); return; } Node current = head; for (int i = 0; i < index; i++) { current = current.next; } current.data = newData; }
-
Спочатку перевіряємо, чи знаходиться цей
indexу нашому списку за допомогою оператораif. Якщо ні, виводимо повідомлення "Invalid index" і завершуємо виконання методу. Це робиться для уникнення помилок; -
Якщо індекс знаходиться в межах нашого списку, переходимо до знайомого алгоритму. Спочатку створюємо об'єкт класу
Nodeз назвоюcurrent, який ініціалізуємо якhead; -
Замість циклу
whileвикористовуємо циклfor, який тут більш доречний, оскільки ми знаємо точну кількість ітерацій, яку потрібно виконати. Кількість ітерацій дорівнює значенню параметраindex; -
Наш цикл виглядає так:
for (int i = 0; i < index; i++). У цьому циклі знаходимо потрібний елемент за допомогою знайомої операції:current = current.next; -
Коли знайдено потрібний елемент, присвоюємо його атрибуту
dataнове значення, виконуючи операціюcurrent.data = newData. ЗначенняnewDataберемо з параметрів цього методу.
Дякуємо за ваш відгук!