单链表是常用的数据结构之一,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。本篇博客介绍如何使用Java实现单链表,并提供了头插法和尾插法的代码示例。
1. 定义节点类
首先,我们需要定义一个节点类ListNode
,用于表示链表中的节点。每个节点包含一个val
属性表示节点的值,以及一个next
属性指向下一个节点。
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
this.next = null;
}
}
2. 定义单链表类
接下来,我们定义一个单链表类LinkedList
,该类具有头指针head
用于指向链表的第一个节点。
class LinkedList {
ListNode head;
// ...
}
3. 头插法
头插法是将新节点插入到链表的头部,使其成为新的第一个节点。实现头插法的步骤如下:
public void insertAtHead(int val) {
ListNode newNode = new ListNode(val);
newNode.next = head;
head = newNode;
}
在insertAtHead
方法中,我们创建了一个新的节点newNode
,将其next
属性指向当前的头节点head
,然后将head
更新为newNode
,使得新节点成为新的头节点。
4. 尾插法
尾插法是将新节点插入到链表的末尾,使其成为链表中最后一个节点。实现尾插法的步骤如下:
public void insertAtTail(int val) {
ListNode newNode = new ListNode(val);
if (head == null) {
head = newNode;
return;
}
ListNode curr = head;
while (curr.next != null) {
curr = curr.next;
}
curr.next = newNode;
}
在insertAtTail
方法中,我们先创建一个新节点newNode
,然后检查链表是否为空。如果链表为空,则将新节点作为头节点。否则,我们通过循环找到链表的最后一个节点,将新节点插入到最后一个节点的next
属性。
5. 打印链表
最后,我们定义一个方法printList
,用于按顺序打印出整个链表的节点值。
public void printList() {
ListNode curr = head;
while (curr != null) {
System.out.print(curr.val + " ");
curr = curr.next;
}
System.out.println();
}
在printList
方法中,我们从头节点开始遍历链表,依次输出每个节点的值,并用空格隔开。
6. 测试代码
为了验证我们实现的头插法和尾插法是否正确,我们可以编写一段测试代码。以下是一个简单的示例:
public class Main {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.insertAtHead(1);
linkedList.insertAtHead(2);
linkedList.insertAtHead(3);
linkedList.printList(); // 输出: 3 2 1
linkedList.insertAtTail(4);
linkedList.insertAtTail(5);
linkedList.printList(); // 输出: 3 2 1 4 5
}
}
在测试代码中,我们创建了一个LinkedList
对象,然后通过调用insertAtHead
和insertAtTail
方法插入节点,最后使用printList
方法打印出整个链表。