package com.algorithm;
/**
* describe: 链表实现
* create on: 2011-05-25
* @author sylor.liu
* @version 1.0
* @since jdk1.6
*/
public class SimulateLink {
Node head;
public class Node {
Object data;
Node next;
public Node(Object data){
this.data = data;
next = null;
}
}
// 初始化链表
public SimulateLink(){
head = null;
}
// 清空链表
public void clear(){
head = null;
}
// 是否为空
public boolean isEmpty(){
return head == null;
}
// 获得第i个节点
public Node getNode(int i) throws Exception{
if(i < 0 || i >= size()) {
throw new Exception("下标异常");
}
int j = 0;
Node temp = head;
while(temp != null && j < i){
j++;
temp = temp.next;
}
return temp;
}
// 往链表中添加一个节点
public void add(Object d,int i ) throws Exception{
if(i < 0 || i > size()) {
throw new Exception("下标异常");
}
Node node = new Node(d);
// 添加节点为第0个节点
if(i == 0){
node.next = head;
head = node;
return;
}
// 添加节点为最后一个节点
if(size() == i){
getNode(i - 1).next = node;
node.next = null;
return;
}
// 添加节点为中间节点
Node temp = getNode(i);
getNode(i-1).next = node;
node.next = temp;
return;
}
// 从链表中删除一个节点
public void remove(int i) throws Exception{
Node temp;
if(i < 0 || i >= size()) {
throw new Exception("下标异常");
}
// 删除节点为第0个节点
if(i == 0){
temp = getNode(i);
head = temp.next;
temp.next = null;
return;
}
// 删除节点为最后一个节点
if(size() - 1 == i){
temp = getNode(i-1);
temp.next = null;
return;
}
// 删除节点为中间节点
Node tempPre = getNode(i-1);
temp = getNode(i);
tempPre.next = temp.next;
temp.next = null;
return;
}
// 返回链表节点个数
public int size(){
int i = 0;
Node temp = head;
while(temp != null){
i++;
temp = temp.next;
}
return i;
}
// 打印链表中的节点
public String toString(){
StringBuffer sb = new StringBuffer();
Node temp = head;
while(temp != null){
sb = sb.append(temp.data + "->");
temp = temp.next;
}
return sb.toString();
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
SimulateLink sl = new SimulateLink();
sl.add(0, 0);
sl.add(1, 1);
sl.add(2, 2);
sl.add(3, 3);
sl.add(4, 4);
sl.add(34, 3);
sl.add(34, 0);
System.out.println(sl);
sl.remove(3);
System.out.println(sl);
sl.remove(0);
System.out.println(sl);
sl.remove(sl.size() - 1);
System.out.println(sl);
}
}