废话不多说,直接看代码,注释应该说的很明白了
public class MyLinkedList {
//头节点指针
private Node head;
//尾节点指针
private Node last;
//链表实际长度
private int size;
/**
* 链表插入元素
* @param index 插入位置
* @param data 插入元素
*/
public void insert(int index, int data) throws Exception {
if (index<0 || index>size) {
throw new IndexOutOfBoundsException("超出链表节点范围!");
}
Node insertedNode = new Node(data);//创建一个节点
if(size == 0){
//空链表
head = insertedNode;
last = insertedNode;//头和尾都指向第一个节点
} else if(index == 0){
//插入头部
insertedNode.next = head;
head = insertedNode;//头部往上移动
}else if(size == index){
//插入尾部
last.next = insertedNode;//最后一个节点指向新插入的节点
last = insertedNode;//尾部向后移动
}else {
//插入中间
Node prevNode = get(index-1);//查找前置节点位置
insertedNode.next = prevNode.next;//新节点指向前置节点所指向的位置
prevNode.next = insertedNode;//前置节点指向新节点
}
size++;
}
/**
* 链表删除元素
* @param index 删除的位置
*/
public Node remove(int index) throws Exception {
if (index<0 || index>=size) {
throw new IndexOutOfBoundsException("超出链表节点范围!");
}
Node removedNode = null;//先置空
if(index == 0){
//删除头节点
removedNode = head;
head = head.next;//头节点向下移动
if(size == 1){
last = null;
}
}else if(index == size-1){
//删除尾节点
Node prevNode = get(index-1);//查找前置节点位置
removedNode = prevNode.next;//最后一个节点
prevNode.next = null;//置空
last = prevNode;//尾节点前提
}else {
//删除中间节点
Node prevNode = get(index-1);//查找前置节点位置
Node nextNode = prevNode.next.next;//删除节点的后一节点
removedNode = prevNode.next;//记录要删除的节点
prevNode.next = nextNode;//前置节点指向删除节点的后一节点
}
size--;
return removedNode;
}
/**
* 链表查找元素
* @param index 查找的位置
*/
public Node get(int index) throws Exception {
if (index<0 || index>=size) {
throw new IndexOutOfBoundsException("超出链表节点范围!");
}
Node temp = head;//临时节点,看作指针
for(int i=0; i<index; i++){
temp = temp.next;//往后移
}
return temp;//目标
}
/**
* 输出链表
*/
public void output(){
Node temp = head;
while (temp!=null) {
System.out.println(temp.data);
temp = temp.next;
}
}
/**
* 链表节点
*/
private static class Node {
int data;/**数据**/
Node next;/**指向下一个节点**/
Node(int data) {
this.data = data;
}
}
public static void main(String[] args) throws Exception {
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.insert(0,3);//3
myLinkedList.insert(0,4);//4,3
myLinkedList.insert(2,9);//4,3,9
myLinkedList.insert(3,5);//4,3,9,5
myLinkedList.insert(1,6);//4,6,3,9,5
myLinkedList.remove(0);//6,3,9,5
myLinkedList.output();
}
}