Реалізація 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беремо з параметрів цього методу.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you show me the code for the append method?
How would you implement the read operation in code?
Can you explain how the update method works with an example?
Чудово!
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беремо з параметрів цього методу.
Дякуємо за ваш відгук!