返回
链表:掌握Java实现单向链表的奥秘,轻松理解数据结构的奇妙
后端
2024-01-24 07:54:56
单向链表的奥秘
单向链表,顾名思义,是一种只允许从一个方向访问元素的链表。它由一组被称为节点的元素组成,每个节点包含数据值和指向下一个节点的指针。这种结构使链表具有灵活性和动态性,非常适合存储和操作顺序数据。
用Java代码实现单向链表
为了更好地理解单向链表,让我们用Java代码亲手实现一个。首先,我们需要定义一个Node类来表示链表中的节点。
public class Node<T> {
private T data;
private Node<T> next;
public Node(T data) {
this.data = data;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Node<T> getNext() {
return next;
}
public void setNext(Node<T> next) {
this.next = next;
}
}
接下来,我们定义一个LinkedList类来表示整个链表。
public class LinkedList<T> {
private Node<T> head;
private Node<T> tail;
private int size;
public LinkedList() {
this.head = null;
this.tail = null;
this.size = 0;
}
public void addFirst(T data) {
Node<T> newNode = new Node<>(data);
if (isEmpty()) {
head = newNode;
tail = newNode;
} else {
newNode.setNext(head);
head = newNode;
}
size++;
}
public void addLast(T data) {
Node<T> newNode = new Node<>(data);
if (isEmpty()) {
head = newNode;
tail = newNode;
} else {
tail.setNext(newNode);
tail = newNode;
}
size++;
}
public T removeFirst() {
if (isEmpty()) {
return null;
}
T data = head.getData();
head = head.getNext();
if (head == null) {
tail = null;
}
size--;
return data;
}
public T removeLast() {
if (isEmpty()) {
return null;
}
T data = tail.getData();
Node<T> current = head;
while (current.getNext() != tail) {
current = current.getNext();
}
tail = current;
tail.setNext(null);
if (tail == null) {
head = null;
}
size--;
return data;
}
public T get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node<T> current = head;
for (int i = 0; i < index; i++) {
current = current.getNext();
}
return current.getData();
}
public void set(int index, T data) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node<T> current = head;
for (int i = 0; i < index; i++) {
current = current.getNext();
}
current.setData(data);
}
public void insert(int index, T data) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException();
}
if (index == 0) {
addFirst(data);
} else if (index == size) {
addLast(data);
} else {
Node<T> newNode = new Node<>(data);
Node<T> current = head;
for (int i = 0; i < index - 1; i++) {
current = current.getNext();
}
newNode.setNext(current.getNext());
current.setNext(newNode);
size++;
}
}
public void remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
if (index == 0) {
removeFirst();
} else if (index == size - 1) {
removeLast();
} else {
Node<T> current = head;
for (int i = 0; i < index - 1; i++) {
current = current.getNext();
}
current.setNext(current.getNext().getNext());
size--;