链表,使用java实现。

使用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;
    }
}

以下为运行结果。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值