链表是数据结构中一种基础且重要的数据结构,它允许我们有效地在序列中插入和删除元素,而无需重新分配整个数据结构。与数组相比,链表提供了更高的灵活性,但也可能在访问速度上有所牺牲。现在我将将从基础概念出发,逐步深入链表并详细探讨链表的基本操作及其与数组的性能差异和适用场景
基础概念
链表其中的每个元素都是一个节点对象,各个节点通过“引用”相连接。引用记录了下一个节点的内存地址,通过它可以从当前节点访问到下一个节点。
链表常用操作
头插
创建一个新的节点,并将其值设置为要插入的值。将新节点的next
指针指向当前链表的头节点。更新链表的头指针,使其指向新节点。
public void insertHead(ListNode head, int value) {
ListNode newNode = new ListNode(value);
newNode.next = head;
head = newNode;
}
尾插
创建一个新的节点,并将其值设置为要插入的值。遍历链表,直到找到最后一个节点(即next
为null
的节点)。将最后一个节点的next
指针指向新节点。
public ListNode insertAtTail(ListNode head, int value) {
ListNode newNode = new ListNode(value);
if (head == null) {
return newNode;
}
ListNode current = head;
while (current.next != null) {
current = current.next;
}
current.next = newNode;
return head;
}
中间插入
创建一个新的节点,并将其值设置为要插入的值。遍历链表,直到找到要插入位置的前一个节点。将新节点的next
指针指向要插入位置的原节点。更新前一个节点的next
指针,使其指向新节点。
public ListNode insertAtIndex(ListNode head, int index, int value) {
ListNode newNode = new ListNode(value);
ListNode current = head;
int currentIndex = 1;
while (current.next != null && currentIndex < index - 1) {
current = current.next;
currentIndex++;
}
newNode.next = current.next;
current.next = newNode;
return head; // 返回头节点
}
适用场景
链表:适用于需要频繁插入和删除元素的场景,以及元素大小不确定或动态变化的场景。
数组:适用于元素大小固定、不经常插入和删除元素的场景,以及需要快速访问元素的场景。
标签:current,head,ListNode,实现,next,链表,节点 From: https://blog.csdn.net/qishuang6/article/details/142188028