在链表的指定位置 index 插入一个新节点

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,其数据为 datanext 指针为 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
执行过程
  1. 调用 add(1, 15)

    • 在位置 1 插入数据 15

    • 找到位置 0 的节点 10

    • 将新节点 15 插入到 10 和 20 之间。

    • 链表状态:10 -> 15 -> 20 -> 30 -> null

  2. 调用 add(0, 5)

    • 在位置 0 插入数据 5

    • 找到位置 -1 的节点(即链表头部)。

    • 将新节点 5 插入到链表头部。

    • 链表状态:5 -> 10 -> 15 -> 20 -> 30 -> null


注意事项

  1. 边界检查

    • 如果 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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

步行cgn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值