public void add(int index,E data){
Node node=new Node(data,null);
Node temp=first;
for(int i=0;i<index-1;i++){
temp=temp.next;
}
node.next=temp.next;
temp.next=node;
size++;
}
代码功能
-
在链表的指定位置
index
插入一个新节点,节点的数据为data
。 -
如果
index
为 0,表示在链表头部插入节点。 -
如果
index
大于 0,找到index-1
位置的节点,将新节点插入到它的后面。
代码逐行解释
1. public void add(int index, E data) {
-
定义一个
add
方法,接收两个参数:-
int index
:插入位置的下标。 -
E data
:要插入的数据。
-
-
返回类型为
void
,表示该方法不返回任何值。
2. Node node = new Node(data, null);
-
创建一个新节点
node
,其数据为data
,next
指针为null
。 -
假设
Node
类的定义如下:
class Node<E> {
E data;
Node<E> next;
Node(E data, Node<E> next) {
this.data = data;
this.next = next;
}
}
3. Node temp = first;
-
创建一个临时变量
temp
,初始值为链表的第一个节点first
。 -
temp
用于遍历链表,找到插入位置的前一个节点。
4. for (int i = 0; i < index - 1; i++) {
-
使用
for
循环遍历链表:-
从
i = 0
开始,到i = index - 1
结束。 -
目的是将
temp
移动到index-1
位置的节点。
-
5. temp = temp.next;
-
将
temp
移动到下一个节点,继续遍历。
6. }
-
循环结束后,
temp
指向index-1
位置的节点。
7. node.next = temp.next;
-
将新节点
node
的next
指针指向temp
的下一个节点。 -
这样,新节点
node
就插入到了temp
和temp.next
之间。
8. temp.next = node;
-
将
temp
的next
指针指向新节点node
。 -
完成插入操作。
9. size++;
-
增加链表的大小
size
,表示链表中节点的数量增加了一个。
示例
假设链表初始状态为:
10 -> 20 -> 30 -> null
执行过程
-
调用
add(1, 15)
:-
在位置
1
插入数据15
。 -
找到位置
0
的节点10
。 -
将新节点
15
插入到10
和20
之间。 -
链表状态:
10 -> 15 -> 20 -> 30 -> null
。
-
-
调用
add(0, 5)
:-
在位置
0
插入数据5
。 -
找到位置
-1
的节点(即链表头部)。 -
将新节点
5
插入到链表头部。 -
链表状态:
5 -> 10 -> 15 -> 20 -> 30 -> null
。
-
注意事项
-
边界检查:
-
如果
index
小于 0 或大于链表长度,应该抛出异常或返回错误。 -
例如:
if (index < 0 || index > size) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); }
插入到链表头部:
-
如果
index
为 0,需要特殊处理:if (index == 0) { node.next = first; first = node; } else { // 正常插入逻辑 }
总结
-
功能:在链表的指定位置插入一个新节点。
-
时间复杂度:O(n),其中
n
是链表的长度。因为需要遍历链表找到插入位置的前一个节点。 -
优化:如果链表维护一个指向最后一个节点的指针
last
,可以在尾部插入时优化为 O(1)。
-