下图表示一种单向列表。其中指针first指向队头,last指向队尾,curr指向当前读的数据。
下面是我的实现代码,很简单,明白上述结构后,关键是构造一个内部类,里面包含一个指向下一个元素的对象(指向下一个元素的指针)
package cn.xy.linkedlist;
public class MyLinkedList<T> {
// 指向list中最后一个元素
Node<T> last;
// 指向list中第一个元素
Node<T> first;
// 指向当前读取的元素
Node<T> currRead;
private int size;
/**
* <默认构造函数>
*/
public MyLinkedList() {
size = 0;
last = new Node(null, -1);
first = last;
currRead = first;
}
/**
* 往链表中添加数据(队尾添加数据)
*/
public T add(T element) {
Node<T> newNode = new Node<T>(null, element);
last.next = newNode;
last = newNode;
if (size == 0) {
first = newNode;
}
size++;
return element;
}
/**
* 移除链表中的数据(队头移除)
*/
public T remove() {
if (size == 0) {
System.out.println("empty list ");
currRead = first;
return null;
}
T result = first.element;
first = first.next;
currRead = first;
size--;
return result;
}
/**
* 获取队列中的元素
*/
public T get() {
if (currRead.next == null) {
setReadAgain();
return currRead.element;
}
T result = currRead.element;
currRead = currRead.next;
return result;
}
/**
* 再次从头开始读取数据
*/
public void setReadAgain() {
currRead = first;
}
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < size; i++) {
T ele = get();
sb.append(currRead.element + "-->");
}
return sb.toString();
}
/**
* 获取队列大小 <功能详细描述>
*/
public int getSize() {
return this.size;
}
class Node<T> {
Node<T> next;
T element;
public Node(Node<T> next, T element) {
this.next = next;
this.element = element;
}
}
}
package cn.xy.linkedlist;
public class Test1 {
public static void main(String[] args) {
MyLinkedList linkedList = new MyLinkedList();
System.out.println("-------start-------");
System.out.println(linkedList.toString());
for (int i=0;i<5;i++){
linkedList.add(i+1);
}
System.out.println(linkedList.toString());
for(int i=0;i<5;i++){
System.out.println(linkedList.remove());
}
System.out.println(linkedList.toString());
System.out.println("-------end-------");
}
}