关于链表的结构可以参考一下: https://www.cnblogs.com/ysocean/p/7928988.html
完整代码
package data.structure; /** * 链表的查找、添加与删除 * */ public class MlnkSingleLinkList { private Node head;//头节点指针 private Node last;//尾节点指针 private int size;//链表长度 /**链表插入元素 * @param data 插入的元素 * @param index 插入的位置 */ public void insertNode(Object data, int index){ if(index < 0 || index > size) { throw new IndexOutOfBoundsException("超出链表范围!"); } Node insertNode = new Node(data);//构造一个新节点 if (size == 0) { //空链表 head = insertNode; last = insertNode; } else if (index == 0) { //插入头部 insertNode.next = head;//将新插入的节点的next指向head head = insertNode;//头节点指针变成新插入的指针 } else if (index == size) { //插入尾部 last.next = insertNode;//尾节点的next指向插入的节点 last = insertNode;//尾节点指针变成新插入的指针 } else { //插入中间 Node prevNode = getIndex(index - 1);//得到前置节点 Node nextNode = prevNode.next; prevNode.next = insertNode; insertNode.next = nextNode; } size++; System.out.println("添加第 " + index + " 个节点:" + data); } /**链表删除元素 * @param index 删除的位置 */ public void removeNode(int index) { if (index < 0 || index >=size) { throw new IndexOutOfBoundsException("超出链表节点范围!"); } Node removeNode = null; if (index == 0) { //删除头节点 removeNode = head;//暂存,用于返回 head = head.next;//头节点后移 } else if (index == size - 1) { //删除尾节点 Node prevNode = getIndex(index -1);//得到倒数第二个节点 removeNode = prevNode.next;//暂存,返回这个删除的节点 prevNode.next = null;//将倒数第二个节点的next指向空 last = prevNode;//倒数第二个节点变成尾节点 } else { //删除中间节点 Node prevNode = getIndex(index - 1);//前置节点 Node nextNode = prevNode.next.next;//后置节点 removeNode = prevNode.next;//暂存,用于返回 prevNode.next = nextNode; } size--; System.out.println("删除第 " + index + " 个节点:" + removeNode.data); } /**链表查找元素 * @param index 查找的位置 * @return */ private Node getIndex(int index) { if (index < 0 || index >=size) { throw new IndexOutOfBoundsException("超出链表节点范围!"); } Node temp = head;//从头开始找 for (int i = 0; i < index; i++) { temp = temp.next; } return temp; } //链表的节点类 private class Node { Object data;//每个节点的数据 Node next;//每个节点指向下一个节点的连接 Node(Object data){ this.data = data; } } /** * 输出链表 */ private void printLinkList() { Node temp = head;//从头节点开始输出 for (int i = 0; i < size; i++) { System.out.print(temp.data + " "); temp = temp.next; } System.out.println(""); } public static void main(String[] args) { MlnkSingleLinkList linkList = new MlnkSingleLinkList(); System.out.println("===========准备添加节点========="); linkList.insertNode(1, 0); linkList.insertNode(3, 1); linkList.insertNode(5, 2); linkList.insertNode(7, 3); linkList.insertNode(9, 2); System.out.println("===========添加节点后的链表========="); linkList.printLinkList(); System.out.println("===========准备删除节点========="); linkList.removeNode(2); System.out.println("===========删除节点后的链表========="); linkList.printLinkList(); } }运行结果: