Java双向链表引言
在日常编程中,我们经常需要存储和操作数据。链表是一种常见的数据结构,由一系列节点组成,每个节点都包含数据和引用下一个节点。在链表中,每个节点都通过指针连接,形成一个链式结构。在链表中,有一种特殊的链表叫做双向链表,除了引用指向下一个节点外,还引用指向上一个节点。
定义双向链表在Java中,我们可以使用类来定义双向链表。双向链表由多个节点组成,每个节点有一个数据域和两个指针域,一个指向前节点,一个指向后节点。以下是双向链表的类别定义:
class Node { int data; Node prev; Node next; public Node(int data) { this.data = data; this.prev = null; this.next = null; }}class DoublyLinkedList { Node head; // 省略其他方法}
在上面的代码中,我们定义了一个Node
类表示双向链表的节点,其中data
存储节点数据的字段,prev
字段和next
字段分别用于指向前节点和后节点。此外,我们还定义了一个DoublyLinkedList
类表示整个双向链表,其中head
该字段用于指向链表的头节点。
双向链表支持插入节点、删除节点、搜索节点等一系列操作。下面我们将详细介绍这些操作的实现情况。
插入节点将节点插入双向链表相对简单。我们只需将新节点插入指定位置并更新相关指针即可。以下是将节点插入链表头部的示例代码:
void insertAtBeginning(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; } else { newNode.next = head; head.prev = newNode; head = newNode; }}
在上述代码中,我们首先创建了一个新的节点newNode
,然后判断链表是否为空。假如链表是空的,那就是head
指向新节点。如果链表不空,将新节点插入链表头部,即将到来next
指向当前头节点,指向当前头节点prev
指向新节点,并将head
指向新节点。
删除双向链表中的节点也相对简单。我们只需要找到要删除的节点并更新相关指针。以下是删除指定节点的示例代码:
void deleteNode(Node toDelete) { if (toDelete == null) { return; } if (toDelete == head) { head = head.next; } if (toDelete.next != null) { toDelete.next.prev = toDelete.prev; } if (toDelete.prev != null) { toDelete.next.prev = toDelete.prev; } if (toDelete.prev != null) { toDelete.prev.next = toDelete.next; }}
在上述代码中,我们首先判断要删除的节点是否为空。如果是空的,直接返回。然后判断要删除的节点是否为头部节点。如果是头部节点,则head
指向下一个节点。然后更新要删除节点的前一个节点next
指针和后一个节点prev
指针,指向正确的节点。
在双向链表中找到节点的操作相对简单。我们只需要通过链表一个接一个地比较节点的值,直到我们找到目标节点或通过链表的末尾。以下是搜索节点的示例代码:
Node search(int data) { Node current = head; while (current != null) { if (current.data == data) { return current; } current = current.next; } return null;}
在上述代码中,我们首先将头节点赋值为变量current
,然后使用while
循环遍历链表。在
