单链表的Java代码实现
public class SingleLinkedImpl {
/** 头部节点 */
private Node head;
/** 尾部节点 */
private Node last;
/** 链表的实际长度 */
private int size;
/**
* @param data 插入元素
* @param index 插入的位置
*/
public void insert(int 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;
head = insertNode;
} else if (size == index) {
// 尾部插入
last.next = insertNode;
last = insertNode;
} else {
// 中间插入
// 获取前一个节点
Node preNode = get(index - 1);
// 修改节点指向
insertNode.next = preNode.next;
preNode.next = insertNode;
}
size++;
}
/**
* 根据索引删除节点
*
* @param index
*/
public Node deleteNode(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("链表越界");
}
Node deleteNode = null;
// 删除头节点
if (index == 0) {
head = head.next;
deleteNode = head;
} else if (index == size - 1) {
// 尾部删除节点
Node prevNode = get(index - 1);
deleteNode = prevNode.next;
prevNode.next = null;
last = prevNode;
} else {
// 中间删除节点
Node prevNode = get(index - 1);
Node nextNode = prevNode.next.next;
deleteNode = prevNode.next;
prevNode.next = nextNode;
}
size --;
return deleteNode;
}
/**
* 根据位置查找链表的节点
*
* @param index
* @return
*/
public Node get(int index) {
if (index < 0 || index >= size - 1) {
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 = " + temp.data);
temp = temp.next;
}
}
public int getSize(){
return size;
}
public int getHead() {
return head.data;
}
public int getTail(){
return last.data;
}
private static class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
}
}
}