不使用虚拟头节点进行单向链表的创建和实现,需要注意在添加和删除节点操作时对头节点进行特殊处理,其余的操作大同小异.
代码如下:
实现类:
/**
* 链表类
* @author ChenZhuJi
*
* @param <E>
*/
public class LinkedList<E> {
//私有的内部类,仅在这个类中能够使用,表示一个节点
private class Node {
public E e; //节点中存储的数据
public Node next; //下一个节点
public Node(E e,Node next) {
this.e = e;
this.next = next;
}
public Node() {
this(null,null);
}
public Node(E e) {
this(e,null);
}
@Override
public String toString() {
return e.toString();
}
}
private Node head; //头节点
private int size; //链表的长度
public LinkedList() {
head = new Node();
size = 0;
}
/**
* 获取链表的长度
* @return 链表长度
*/
public int getSize() {
return size;
}
/**
* 获取链表中指定索引的元素
* @param index 索引值
* @return 元素值
*/
public E get(int index) {
if(index >= size || index < 0) {
throw new IllegalArgumentException("索引值不存在或索引越界");
}
Node pre = head;
for(int i = 0; i < index;i++) {
pre = pre.next;
}
return pre.e;
}
/**
* 获取链表的表头元素
* @return 表头元素
*/
public E getFirst() {
return get(0);
}
/**
* 获取链表的表尾元素
* @return 表尾元素
*/
public E getLast() {
return get(size -1);
}
/**
* 判断链表是否为空
* @return 链表是否为空
*/
public boolean isEmpty() {
return size ==0;
}
/**
* 在链表头添加一个元素
* @param e 要添加的元素
*/
public void addFirst(E e) {
head = new Node(e,head);
size++;
}
/**
* 向链表中的指定索引添加元素
* @param e 要添加的元素
* @param index 索引值
*/
public void add(E e,int index) {
if(index <0 || index >size) {
throw new IllegalArgumentException("索引值不存在或索引越界");
}
if(index == 0) {
addFirst(e);
} else {
Node pre = head;
for(int i = 0; i < index - 1; i++) {
pre = pre.next;
}
pre.next = new Node(e,pre.next);
size++;
}
}
/**
* 向链表的尾部添加元素
* @param e 要添加的元素
*/
public void addLast(E e) {
add(e,size);
}
/**
* 删除链表中指定索引的元素
* @param index 索引值
* @return 被删除的元素
*/
public E remove(int index) {
if( index >= size || index < 0) {
throw new IllegalArgumentException("索引值不存在或索引越界");
}
if(index == 0) {
return removeFirst();
}
Node pre = head;
for(int i = 0; i < index - 1; i++) {
pre = pre.next;
}
Node ret = pre.next;
pre.next = pre.next.next;
size --;
return ret.e;
}
/**
* 删除链表头元素
* @return 被删除的元素
*/
public E removeFirst() {
Node ret = head;
head = head.next;
size --;
return ret.e;
}
/**
* 删除链表尾元素
* @return 被删除的元素
*/
public E removeLast() {
return remove(size - 1);
}
/**
* 将指定索引元素的值进行修改
* @param index 索引值
* @param e 新的元素值
*/
public void set(int index,E e) {
if( index >= size || index < 0) {
throw new IllegalArgumentException("索引值不存在或索引越界");
}
Node pre = head;
for(int i = 0; i <index; i++) {
pre = pre.next;
}
pre.e = e;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("LinkedListed : size = " + getSize() + ", head [ ");
Node pre = head;
for(int i = 0; i < size - 1; i++) {
sb.append(pre.e + "->");
pre = pre.next;
}
sb.append(pre.e +" ]");
return sb.toString();
}
}
测试类代码:
public class Main {
public static void main(String[] args) {
LinkedList<Integer> ll = new LinkedList<Integer>();
for(int i = 0; i < 10; i++) {
ll.addLast(i);
System.out.println(ll);
}
ll.remove(5);
System.out.println(ll);
}
}