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指针了:
- 先创建新的
LinkedListNode<Person>节点,把传入的data放进去 - 分三种情况处理:
- 插入头部:新节点的
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
相关产品推荐
相关产品推荐

