package cn.com.factroy2;
/**
* 可以看做是操作链表的工具类,链表的核心结构就是节点的数据结构
* @author wanjn
*
*/
public class SinglyLinkedList {
//存放头结点
private Node head;
//存放尾节点
private Node last;
//链表长度
private int size = 0;
/**
* 默认在最后添加元素
* @param data
*/
public void add(Object data){
addLastNode(data);
}
/**
* 向链表中添加头节点
* @param data
*/
public void addFirstNode(Object data){
if (head==null) {//添加的第一个节点作为头结点
head = new Node(data, null);
last = head;
}else {//不是头结点,将新的节点作为头结点
head = new Node(data, head);
}
size++;
}
/**
* 清空链表
*/
public void clear() {
int length = length();
for (int i = 0; i < length; i++) {
delete(0);
}
}
/**
* 向链表中添加尾部节点
* @param data
*/
public void addLastNode(Object data){
//head 要保持不变
if (head==null) {//这里可以使用新增一个辅助节点的监督元思想,去掉一个判断,减少执行判断的时间;当然啦最后需要将监督元删除即可
head = new Node(data, null);
last = head;
}else {
last.next=new Node(data, null);
last = last.next;
}
size++;
}
/**
* 获得链表的长度
* @return 长度
*/
public int length(){
return size;
}
/**
* 根据索引设置对应节点的值
* @param index
* @param data
*/
public void set(int index,Object data){
getNode(index).data=data;
}
/**
* 根据索引删除对应的节点
* @param index
*/
public void delete(int index){
Node current = getNode(index);
//删除头结点
if (index==0) {
if (size==1) {
head = null;
}else {
head = getNode(index+1);
}
}else if (index == size-1) {
//删除尾节点
last =getNode(index-1);
getNode(index-1).next=null;
}else {
//删除非头结点和尾节点
Node pre = getNode(index-1);
Node next = getNode(index+1);
pre.next = next;
}
//这个必须放在后面,不能放在开始,否则会影响(找不到)下一个节点的查找
current.next = null;
size--;
}
/**
* 根据索引获取链表对应节点的值
* @param index
* @return
*/
public Object get(int index){
return getNode(index).data;
}
@Override
public String toString() {
String result="";
Node temp = head;
if (temp!=null) {
while (temp!=null) {
result+= temp.data+ ", ";
temp = temp.next;
}
result = result.substring(0,result.lastIndexOf(", ")) ;
}
return "["+result+"]" ;
}
/**
* 根据索引获取链表对应节点
* @param index
* @return
*/
private Node getNode(int index){
if (index<0||index>=size) {
throw new RuntimeException("索引超出范围!");
}
Node temp = head;
for (int i = 0; i <size; i++) {
if (i==index) {
break;
}
temp = temp.next;
}
return temp;
}
/**
* 将节点的关系操作封装在了node的构造方法中
* @author
*
*/
private class Node {
public Object data;
public Node next;
public Node(Object data, Node next) {
super();
this.data = data;
this.next = next;
}
}
}