关于链表的结构可以参考一下:
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();
}
}
运行结果: