package test.linetable;
public class SingleLinkTableDemo {
private SingleNode firstNode;
private SingleNode lastNode;
private int size;
/**
* 获取第n个节点
* @param index
* @return
* @throws Exception
*/
public SingleNode getNode(int index) throws Exception{
if(index >= size) throw new Exception(" out of range!");
SingleNode node = null;
SingleNode tmpNode = firstNode;
for(int i = 0;i < size;i++){
if(i == index) {
node = tmpNode;
break;
}
tmpNode = tmpNode.getNext();
}
return node;
}
/**
* 增加新节点
* @param newValue
*/
public void addNode(String newValue){
SingleNode newNode = new SingleNode(newValue);
if(firstNode == null) {
firstNode = newNode;
lastNode = newNode;
}else{
//设置当前最后一个节点的下一个节点为新增节点
lastNode.setNext(newNode);
//将最后一个节点指针指向新增节点
lastNode = newNode;
}
size++;
}
/**
* 在当前节点后插入一个新节点
* @param currNode
* @param newNode
*/
public void insertNode(SingleNode currNode,SingleNode newNode){
newNode.setNext(currNode.getNext());
currNode.setNext(newNode);
size++;
}
/**
* 删除第n个节点,所谓线性表的链式存储删除插入的时间复杂度为O(1),
* 是要先知道当前节点的情况,如果不知道,还是要进行遍历线性表的,因此实际应用中,时间复杂度还是O(n),所以性能一定不如线性表的顺序存储!
* @param i
* @throws Exception
*/
public void deleteNode(int currIndex) throws Exception{
if(currIndex < 0 || currIndex > (size - 1) ) throw new Exception("out of range!");
int j = currIndex - 1 < 0 ? 0: currIndex - 1;
SingleNode tmpNode = firstNode;
if(currIndex == 0) {
firstNode = firstNode.getNext();
}else{
for(int i = 0;i < size;i++){
if(i == j) {
SingleNode nextNode = tmpNode.getNext().getNext();
tmpNode.setNext(nextNode);
if(currIndex == (size -1)) lastNode = tmpNode;
break;
}
tmpNode = tmpNode.getNext();
}
}
if(size > 0) size--;
}
public SingleNode getFirstNode() {
return firstNode;
}
public SingleNode getLastNode() {
return lastNode;
}
public int getSize(){
return size;
}
public static void main(String[] args){
SingleLinkTableDemo sd = new SingleLinkTableDemo();
sd.addNode("0");
sd.addNode("1");
sd.addNode("2");
sd.addNode("3");
sd.addNode("4");
sd.printList(sd);
System.out.println("-----------------------------------");
try {
SingleNode indexNode = sd.getNode(2);
SingleNode newNode = new SingleNode("900");
sd.insertNode(indexNode, newNode);
sd.printList(sd);
System.out.println("-----------------------------------");
sd.deleteNode(sd.getSize() -1);
System.out.println("first Node = " + sd.getFirstNode().getValue());
sd.printList(sd);
System.out.println("last Node = " + sd.getLastNode().getValue());
} catch (Exception e) {
e.printStackTrace();
}
System.exit(0);
}
/**
* 遍历当前线性表
* @param sd
*/
public void printList(SingleLinkTableDemo sd){
for(int i = 0;i < sd.getSize();i++){
SingleNode tmpNode;
try {
tmpNode = sd.getNode(i);
System.out.println("node" + i + " =" + tmpNode.getValue());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class SingleNode {
public String value;
public SingleNode next;
public SingleNode(String value){
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public SingleNode getNext() {
return next;
}
public void setNext(SingleNode next) {
this.next = next;
}
}