You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何在LinkedList指定索引处插入节点?作业实现求助

实现LinkedList指定位置插入节点的方法

嘿,我来帮你搞定这个作业里的插入方法!首先咱们得明确几个前提:假设你的LinkedList<T>类提供了最基础的getHead()、getTail()、setHead()、setTail()方法,而LinkedListNode<T>有getData()、getNext()和setNext()这几个核心方法——毕竟这是链表节点的基础功能对吧?

接下来咱们一步步拆解实现逻辑:

第一步:处理边界异常

首先得先把一些非法情况拦下来,避免程序出错:

  • 如果index < 0,直接抛出IllegalArgumentException,因为索引不能为负
  • 如果链表为空,那只有index == 0是合法的插入位置,否则也抛出异常
  • 如果index大于当前链表的长度,同样不合法(注意:链表长度是节点总数,比如有3个节点,合法索引是0、1、2,插在尾部的话index等于长度3也是允许的,这里要区分)

第二步:找到插入位置的前驱节点

要插入节点,关键是找到要插入位置的前一个节点(前驱节点):

  • 如果index == 0,说明要插在头部,前驱节点就是null
  • 如果index等于链表长度,说明要插在尾部,前驱节点就是链表的尾节点
  • 其他情况,从头部开始遍历,走index-1步,就能找到前驱节点

第三步:调整指针完成插入

有了前驱节点,就可以调整节点的next指针了:

  1. 先创建新的LinkedListNode<Person>节点,把传入的data放进去
  2. 分三种情况处理:
    • 插入头部:新节点的next指向原来的头节点;然后更新链表的头为新节点。如果原来链表是空的,还要把尾节点也设为新节点
    • 插入尾部:把前驱节点(原尾节点)的next设为新节点;然后更新链表的尾为新节点
    • 插入中间:新节点的next指向前驱节点原来的next;然后把前驱节点的next设为新节点

完整代码示例

public static void insert(LinkedList<Person> list, int index, Person data) {
    // 处理边界异常
    if (index < 0) {
        throw new IllegalArgumentException("Index cannot be negative");
    }
    LinkedListNode<Person> head = list.getHead();
    LinkedListNode<Person> tail = list.getTail();
    
    // 空链表的情况
    if (head == null) {
        if (index != 0) {
            throw new IllegalArgumentException("Cannot insert at index " + index + " into empty list");
        }
        LinkedListNode<Person> newNode = new LinkedListNode<>(data);
        list.setHead(newNode);
        list.setTail(newNode);
        return;
    }
    
    // 计算链表长度(也可以遍历到index的时候判断是否超出)
    int length = 0;
    LinkedListNode<Person> current = head;
    while (current != null) {
        length++;
        current = current.getNext();
    }
    if (index > length) {
        throw new IllegalArgumentException("Index " + index + " is out of bounds for list of length " + length);
    }
    
    LinkedListNode<Person> newNode = new LinkedListNode<>(data);
    // 插入头部
    if (index == 0) {
        newNode.setNext(head);
        list.setHead(newNode);
        return;
    }
    // 插入尾部
    if (index == length) {
        tail.setNext(newNode);
        list.setTail(newNode);
        return;
    }
    // 插入中间:找到前驱节点
    LinkedListNode<Person> prev = head;
    for (int i = 0; i < index - 1; i++) {
        prev = prev.getNext();
    }
    // 调整指针
    newNode.setNext(prev.getNext());
    prev.setNext(newNode);
}

一些补充说明

  • 这里假设LinkedListNode<T>有一个接收数据的构造方法LinkedListNode(T data),如果你的节点类构造方式不同,记得调整
  • 计算链表长度的部分,也可以在遍历找前驱节点的时候同时判断是否超出范围,这样可以减少一次遍历,优化性能——比如在找前驱的循环里,如果prev变成null了,说明index超出了,直接抛异常
  • 如果你的LinkedList<T>类还提供了size()方法,那直接用list.size()代替手动计算长度会更方便

内容的提问来源于stack exchange,提问作者Fihii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:32:42