在Java编程中,LinkedList是一种常用的数据结构,它可以用来实现双向链表。LinkedList主要提供了三种链表类型:单链表、双链表和循环链表。每种链表都有自己独特的特点和使用场景。
1. 单链表
单链表是一个只有一个头节点的链表,它的每个节点都包含一个数据元素和一个指向下一个节点的指针。单链表的特点是简单易用,插入和删除操作较为方便,但在访问某个节点的数据时需要遍历整个链表。
1.1 定义及使用
public class SingleLinkedList {
Node head; // 头节点
// 定义节点类
static class Node {
int data; // 数据元素
Node next; // 指向下一个节点的指针
Node(int d) {
data = d;
next = null;
}
}
// 向链表尾部添加节点
public void append(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
} else {
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = newNode;
}
}
// 删除指定位置的节点
public void deleteAtPosition(int position) {
if (position == 0) {
head = head.next;
return;
}
Node temp = head, prev = null;
for (int i = 0; i < position - 1; i++) {
prev = temp;
temp = temp.next;
}
if (temp == null) return;
prev.next = temp.next;
}
// 打印链表
public void print() {
Node temp = head;
while (temp != null) {
System.out.print(temp.data + " -> ");
temp = temp.next;
}
System.out.println("null");
}
}
2. 双链表
双链表是由两个指针(prev和next)组成的链表,每个节点除了包含数据元素外,还需要包含一个指向下一个节点的指针以及一个指向前一个节点的指针。双链表的特点是可以快速定位到指定节点,以及在运行时进行插入和删除操作更加高效。但需要注意的是,双链表的内存占用较大,因为它需要额外的指针空间。
2.1 定义及使用
public class DoubleLinkedList {
Node head, tail; // 头节点和尾节点
// 定义节点类
static class Node {
int data; // 数据元素
Node prev, next; // 指向前一个节点的指针以及指向下一个节点的指针
Node(int d) {
data = d;
prev = null;
next = null;
}
}
// 在链表尾部添加节点
public void append(int data) {
Node newNode = new Node(data);
if (tail == null) {
head = newNode;
tail = newNode;
} else {
tail.next = newNode;
tail = newNode;
}
}
// 删除指定位置的节点
public void deleteAtPosition(int position) {
if (position == 0) {
head = head.next;
return;
}
Node temp = head, prev = null;
for (int i = 0; i < position - 1; i++) {
prev = temp;
temp = temp.next;
}
if (temp == null) return;
prev.next = temp.next;
}
// 打印链表
public void print() {
Node temp = head;
while (temp != null) {
System.out.print(temp.data + " -> ");
temp = temp.next;
}
System.out.println("null");
}
}