📅  最后修改于: 2023-12-03 14:42:59.434000             🧑  作者: Mango
链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。Java中提供了多种实现链表的方式,本文将介绍其中的两种:单链表和双向链表。
在单链表中,每个节点包含一个数据元素和一个指向下一个节点的指针。最后一个节点指向null,表示链表的结束。
下面是一个简单的单链表的实现:
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
class LinkedList {
private ListNode head;
public LinkedList() {
this.head = null;
}
public void add(int val) {
ListNode newNode = new ListNode(val);
if (head == null) {
head = newNode;
} else {
ListNode curr = head;
while (curr.next != null) {
curr = curr.next;
}
curr.next = newNode;
}
}
public void remove(int val) {
if (head == null) {
return;
}
if (head.val == val) {
head = head.next;
return;
}
ListNode curr = head;
while (curr.next != null && curr.next.val != val) {
curr = curr.next;
}
if (curr.next != null) {
curr.next = curr.next.next;
}
}
public void printList() {
ListNode curr = head;
while (curr != null) {
System.out.print(curr.val + " ");
curr = curr.next;
}
System.out.println();
}
}
以上代码中,LinkedList
类维护了一个头部节点head
,并提供了添加节点、删除节点以及打印链表的功能。
使用示例:
LinkedList list = new LinkedList();
list.add(1);
list.add(2);
list.add(3);
list.printList(); // 输出: 1 2 3
list.remove(2);
list.printList(); // 输出: 1 3
双向链表和单链表的结构类似,区别在于每个节点不仅包含指向下一个节点的引用,还包含指向前一个节点的引用。
下面是一个简单的双向链表的实现:
class DoubleListNode {
int val;
DoubleListNode prev;
DoubleListNode next;
DoubleListNode(int val) {
this.val = val;
this.prev = null;
this.next = null;
}
}
class DoublyLinkedList {
private DoubleListNode head;
private DoubleListNode tail;
public DoublyLinkedList() {
this.head = null;
this.tail = null;
}
public void add(int val) {
DoubleListNode newNode = new DoubleListNode(val);
if (head == null) {
head = newNode;
tail = newNode;
} else {
newNode.prev = tail;
tail.next = newNode;
tail = newNode;
}
}
public void remove(int val) {
if (head == null) {
return;
}
DoubleListNode curr = head;
while (curr != null && curr.val != val) {
curr = curr.next;
}
if (curr != null) {
if (curr.prev != null) {
curr.prev.next = curr.next;
} else {
head = curr.next;
}
if (curr.next != null) {
curr.next.prev = curr.prev;
} else {
tail = curr.prev;
}
}
}
public void printList() {
DoubleListNode curr = head;
while (curr != null) {
System.out.print(curr.val + " ");
curr = curr.next;
}
System.out.println();
}
}
以上代码中,DoublyLinkedList
类维护了头部节点head
和尾部节点tail
,并提供了添加节点、删除节点以及打印链表的功能。
使用示例:
DoublyLinkedList list = new DoublyLinkedList();
list.add(1);
list.add(2);
list.add(3);
list.printList(); // 输出: 1 2 3
list.remove(2);
list.printList(); // 输出: 1 3
以上就是Java中链表的简单介绍,希望能对你理解和应用链表数据结构有所帮助。