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);
}
}