Java语言实现的单链表,只实现了基本功能。
单链表的结点由存放数据元素的数据域和存放后继结点地址的指针域组成。java中由于不存在指针,指针域应存放后继结点的引用。
节点类:
/**
* 节点类
* @param <T>
*/
public static class Node<T> {
private T value;
private Node<T> next;
public Node(T value, Node<T> next) {
this.value = value;
this.next = next;
}
public Node(T value){
this(value, null);
}
}
完整代码:
public class SingleLinkedList<T> {
/**
* 节点类
* @param <T>
*/
public static class Node<T> {
private T value;
private Node<T> next;
public Node(T value, Node<T> next) {
this.value = value;
this.next = next;
}
public Node(T value){
this(value, null);
}
}
private Node<T> head;
public SingleLinkedList() {
head = new Node<T>(null);
}
/**
* 单链表添加元素,使用头插法
* @param e 要插入的元素
* @return 正确插入返回true
*/
public boolean add(T e) {
addFirst(e);
return true;
}
/**
* 单链表头插法
* @param e 要插入元素
*/
public void addFirst(T e){
Node<T> newNode = new Node<T>(e, null);
if (size()==0) {
head.next = newNode;
} else {
Node<T> temp = head.next;
head.next = newNode;
newNode.next = temp;
}
}
/**
* 单链表尾插法
* @param e 要插入的元素
*/
public void addLast(T e){
Node<T> newNode = new Node<T>(e, null);
Node<T> temp = head;
while(temp.next!=null){
temp = temp.next;
}
temp.next = newNode;
}
/**
* 返回单链表的大小
* @return 单链表元素的个数
*/
public int size() {
int i = 0;
Node<T> node = head;
while (node.next != null) {
i++;
node = node.next;
}
return i;
}
/**
* 得到某一位置的元素
* @param index 下标
* @return 指定下标的元素
*/
public T get(int index){
if(head==null){
return null;
}
if(index>size()-1||index<0){
return null;
}
Node<T> temp = head.next;
int i=0;
while(temp!=null){
if(index==i){
return temp.value;
}
i++;
temp = temp.next;
}
return null;
}
/**
* 在指定下标处插入元素
* @param e 带插入元素
* @param index 指定下标
* @return
*/
public boolean insert(T e, int index){
validateindex(index);
Node<T> newNode = new Node<T>(e, null);
Node<T> temp = head;
int i=0;
while(temp!=null){
if(index==i){
newNode.next = temp.next;
temp.next = newNode;
return true;
}
i++;
temp = temp.next;
}
return false;
}
/**
* 删除指定下标的元素
* @param index
* @return
*/
public boolean remove(int index){
validateindex(index);
Node<T> temp = head;
Node<T> q;
int i=0;
while(temp!=null){
if(index==i){
q = temp.next;
temp.next = q.next;
}
i++;
temp = temp.next;
}
return true;
}
/**
* 判断下标是否在正常范围内
* @param index 下标
* @return 在0~size-1之间为正常,返回true,否则false
*/
private boolean validateindex(int index) {
if(index<0||index>=size()){
throw new RuntimeException("下标越界: "+index);
}else{
return true;
}
}
@Override
public String toString() {
String str = "[ ";
for (int i=0;i<size();i++) {
str = str + get(i) + " ";
}
str = str + "]";
return str;
}
}
测试如下:
public static void main(String[] args) {
//头插法
SingleLinkedList<String> list = new SingleLinkedList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
System.out.println(list.toString());
list.insert("X", 2);
System.out.println(list.toString());
list.remove(2);
System.out.println(list.toString());
}