使用java实现的链表,具有增删改查的功能。后面我会逐步的优化算法,并以此为基础功能实现栈、队列、二叉树以及图。
public class t_1 {
public static void main(String[] args){
link l = new link();
l.init();//初始化链表
for(int i=0;i<50;i++){
l.link_add(i);//创建链表
}
System.out.println(l.length());
l.scan_link();//打印链表
System.out.println("------------------------");
l.del_find_link(49);//查找49元素并删除它
System.out.println(l.find(40));//查找40元素并返回该元素位置
l.scan_link();//打印处理后的链表
}
}
//链表结点,内部变量使用private修饰,规范化编程,专门设计了方法实现外部调用。
class lnode{
//链表的数据域,这里为了方便,我使用的是int型。
private int data;
//链表的next域,lnode类型的变量。
private lnode next;
//设置next域
void setNext(lnode next){
this.next = next;
}
//设置数据域
void setData(int data){
this.data = data;
}
//提取数据域的内容
int getData(){
return this.data;
}
//提取next引用的对象
lnode getNext(){
return this.next;
}
}
//链表类,将每个功能分别映射成方法,为了方便,类内设置length以保存长度。当然也可以实时计算链表表长。
class link{
private int length;
lnode head;
//初始化链表。
void init(){
head = new lnode();
head.setNext(null);
head.setData(0);
this.length = 0;
}
//将表长使用方法实现外部链接
int length(){
return this.length;
}
//链表判空
boolean link_is_empty(){
return (this.length == 0);
}
//采用头插法添加元素
boolean link_add(int data){
lnode new_lnode = new lnode();
new_lnode.setData(data);
new_lnode.setNext(head.getNext());
head.setNext(new_lnode);
this.length++;
return true;
}
//打印链表的所有元素
boolean scan_link(){
if(link_is_empty()){
System.out.println("嗨害嗨,这是个空表!");
return false;
}
lnode p = head.getNext();
System.out.println("-------链表内物品------");
for(int i=length();i>0;i--){
System.out.print(p.getData()+" ");
p = p.getNext();
}
System.out.println(" ");
System.out.println("---------------------");
return true;
}
//查找元素并返回位置
int find(int data){
if(link_is_empty()){
System.out.println("空表,查个毛?");
System.exit(1);
}
int cache = 0;
lnode p = head.getNext();
//这里一定要计算好当前循环长度与元素位置的数学关系。
for(int j=length();j>0;j--){
if(p.getData()==data){
cache = j;
}
p = p.getNext();
}
if(cache==0){
System.out.println("没有这个元素!");
System.exit(1);
}
return this.length-cache+1;
}
//输入元素查找到目标在再进行删除。
boolean del_find_link(int data){
int po = find(data) - 1;
lnode r = head.getNext();
lnode l = head;
for(int i=po;i>0;i--){
l = r;
r = r.getNext();
}
l.setNext(r.getNext());
this.length--;
return true;
}
}
以下为运行结果。