如何使用Java函数实现双向链表?
发布时间:2023-06-01 12:46:57
双向链表是一种链式数据结构,与单向链表相比,双向链表中每个节点除了一个后继指针以外,还有一个前驱指针,因此可以从前向后或从后向前遍历整个链表。
在Java中,我们可以使用类来实现双向链表。具体步骤如下:
1. 定义一个节点类:Node
class Node{
int data;
Node prev; // 前驱指针
Node next; // 后继指针
public Node(int data){
this.data = data;
this.prev = null;
this.next = null;
}
}
2. 定义一个双向链表类:DoubleLinkedList
class DoubleLinkedList{
Node head; // 链表的头节点
public DoubleLinkedList(){
head = null;
}
// 在链表头部插入节点
public void addFirst(int data){
Node node = new Node(data);
if(head == null){
head = node;
}else{
node.next = head;
head.prev = node;
head = node;
}
}
// 在链表尾部插入节点
public void addLast(int data){
Node node = new Node(data);
if(head == null){
head = node;
}else{
Node temp = head;
while(temp.next != null){
temp = temp.next;
}
temp.next = node;
node.prev = temp;
}
}
// 删除节点
public void deleteNode(Node node){
if(head == null){
return;
}
if(node == head){
head = head.next;
head.prev = null;
}else{
Node prevNode = node.prev;
prevNode.next = node.next;
if(node.next != null){
node.next.prev = prevNode;
}
}
}
// 在指定位置插入节点
public void addNode(int pos, int data){
Node node = new Node(data);
if(head == null){
head = node;
}else{
Node temp = head;
while(pos > 1){
temp = temp.next;
pos--;
}
node.prev = temp;
node.next = temp.next;
temp.next = node;
if(node.next != null){
node.next.prev = node;
}
}
}
// 打印整个链表
public void printList(){
Node temp = head;
while(temp != null){
System.out.print(temp.data + " ");
temp = temp.next;
}
System.out.println();
}
}
在DoubleLinkedList类中,我们实现了以下四个方法:
- addFirst(int data): 在链表头部插入节点;
- addLast(int data): 在链表尾部插入节点;
- deleteNode(Node node): 删除指定节点;
- addNode(int pos, int data): 在指定位置插入节点。
此外,我们还实现了一个方法printList(),用于打印整个链表。
下面是一个简单的测试代码:
public class Test {
public static void main(String[] args) {
DoubleLinkedList list = new DoubleLinkedList();
list.addFirst(1);
list.addFirst(2);
list.addLast(3);
list.addNode(2, 4);
list.printList(); // 2 1 4 3
list.deleteNode(list.head.next);
list.printList(); // 2 4 3
}
}
在这个测试代码中,我们首先创建了一个双向链表list,然后分别使用addFirst()、addLast()和addNode()方法插入了四个节点,最后通过printList()方法打印整个链表。接着使用deleteNode()方法删除了第二个节点,再次调用printList()方法打印整个链表,可以看到第二个节点已经被删除。
