单链表基本操作的java代码实现(使用java语言,用对象模拟单链表节点和单链表,实现单链表的建立[头插法][尾插法]、插入、查找、删除、替换和长度获取)

单链表存储结构图解

在这里插入图片描述

定义单链表节点

/**
 * className:LinkListNoed
 *
 * @author:ZJL
 * @version:0.1
 * @date:2020/7/814:27
 * @since:jdk1.8
 */
public class LinkListNoed {

    /**
     * 定义节点
     */
    private Object date; //数据域
    private  LinkListNoed pNext; //指针域

    public Object getDate() {
        return date;
    }

    public void setDate(Object date) {
        this.date = date;
    }

    public LinkListNoed getpNext() {
        return pNext;
    }

    public void setpNext(LinkListNoed pNext) {
        this.pNext = pNext;
    }

    /**
     * 对象回收(模拟内存释放)
     */
    @Override
    public void finalize() {
        try {
            super.finalize();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}

定义单链表

/**
 * className:LinkList
 *
 * @author:ZJL
 * @version:0.1
 * @date:2020/7/815:10
 * @since:jdk1.8
 */
public class LinkList {
    /**
     * 定义链表
     */
    public LinkListNoed head;//头指针
    public LinkListNoed p;

}

链表初始化类


/**
 * @author:ZJL
 * @version:0.1
 * @date:2020/7/814:10
 * @since:jdk1.8
 */
public class LinkListInitial extends LinkList{
    /**
     * 链表初始化
     */
    public LinkListInitial() {
        LinkListNoed headNode = new LinkListNoed();
        super.head = headNode;
        super.p = super.head;
        super.p.setpNext(null);
        super.p.setDate(null);
    }

}

链表操作工具类

import sun.plugin.javascript.navig.Link;

/**
 * className:LinkLIstOparat
 *
 * @author:ZJL
 * @version:0.1
 * @date:2020/7/815:34
 * @since:jdk1.8
 */
public class LinkLIstOparat {
    /**
     * 尾插法
     * @param newLinkListNode 新申请的节点
     * @param link            插入的链表
     */
    public void AddElementEnd(LinkListNoed newLinkListNode, LinkList link) {

        link.p.setpNext(newLinkListNode);
        link.p = newLinkListNode;

    }

    /**
     * 头插法
     * @param newLinkListNode 新申请的节点
     * @param link            插入的链表
     */
    public void AddElementHead(LinkListNoed newLinkListNode, LinkList link) {

        newLinkListNode.setpNext(link.p);
        link.head.setpNext(newLinkListNode);
        link.p = newLinkListNode;

    }

    /**
     * 查找第一个指定值节点
     *
     * @param obj  指定值
     * @param link 所查找的链表
     * @return
     */
    public LinkListNoed FindElement(Object obj, LinkList link) {
        link.p = link.head;
        boolean flag = false;
        while (link.p.getpNext() != null) {
//            System.out.println(link.p.getDate());
            link.p = link.p.getpNext();
            if (obj.equals(link.p.getDate())) {
                flag = true;
                break;
            }
        }
        if (!flag) {//查找失败,抛出异常
            throw new RuntimeException("链表中不存在该元素!");
        }
        return link.p;
    }
        /**
     * 在存放obj的节点后插入
     * @param noed
     * @param obj
     * @param link
     */
    public void insert(LinkListNoed noed,Object obj,LinkList link){

        LinkListNoed noed1 = FindElement(obj,link);//查找
        //插入
        noed.setpNext(noed1.getpNext());
        noed1.setpNext(noed);

    }
	
    /**
     * 删除第一个指定值元素
     *
     * @param obj
     * @param link
     * @return
     */
    public void delete(Object obj, LinkList link) {
        //查找
        LinkListNoed temp = null;
        link.p = link.head;
        boolean flag = false;
        while (link.p.getpNext() != null) {
            temp = link.p;
            link.p = link.p.getpNext();
            if (link.p.getDate().equals(obj)) {
                flag = true;
                break;
            }
        }
        if (!flag) {//查找失败,抛出异常
            throw new RuntimeException("链表中不存在该元素!");
        }
        //查找结束
        //删除
        temp.setpNext(link.p.getpNext());
        //回收内存(对象)
        link.p.finalize();
    }

    /**
     * 将链表中第一个与参数obj1数据相同的元素替换为obj2
     *
     * @param obj1 被替换的数据
     * @param obj2 替换的数据
     */
    public void modifiyElement(Object obj1, Object obj2, LinkList link) {
        //查找
        link.p = link.head;
        boolean flag = false;
        while (link.p.getpNext() != null) {
            link.p = link.p.getpNext();
            if (obj1.equals(link.p.getDate())) {
                flag = true;
                break;
            }
        }
        if (!flag) {//查找失败,抛出异常
            throw new RuntimeException("链表中不存在该元素!");
        }
        //查找结束
        //替换
        link.p.setDate(obj2);
    }
	/**
     * 获取参数链表的长度
     * @param link
     * @return
     */
    public int getLength(LinkList link) {
        int count = 0;
        link.p = link.head;
        while (link.p.getpNext()!=null){
            link.p = link.p.getpNext();
            count++;
        }
            return count;
    }

    public String toString(LinkListNoed linkListNoed) {
        final StringBuffer sb = new StringBuffer("LinkLIstOparat{");
        String s = String.valueOf(linkListNoed);
        sb.append('}');
        return sb.toString();
    }
}

测试类

/**
 * className:Test
 *
 * @author:ZJL
 * @version:0.1
 * @date:2020/7/815:07
 * @since:jdk1.8
 */
public class Test {

    public static void main(String[] args) {
        LinkList link = new LinkListInitial();
        LinkLIstOparat lo = new LinkLIstOparat();
        LinkListNoed lln = new LinkListNoed();
        //添加4个节点
        lln.setDate("data1");
        lo.AddElementEnd(lln,link);
        LinkListNoed lln1 = new LinkListNoed();
        lln1.setDate("data2");
        lo.AddElementEnd(lln1,link);
        LinkListNoed lln2 = new LinkListNoed();
        lln.setDate("data3");
        lo.AddElementEnd(lln2,link);
        LinkListNoed lln3 = new LinkListNoed();
        lln.setDate("data4");
        lo.AddElementEnd(lln3,link);
        //获取链表长度:
        System.out.println("链表长度:"+lo.getLength(link));
        //date2后插入date0
        LinkListNoed noed = new LinkListNoed();
        noed.setDate("data0");
        lo.insert(noed,"data2",link);
        System.out.println("链表长度:"+lo.getLength(link));
        //删除数据域为"data4"的节点
        lo.delete("data4",link);
        //获取链表长度:
        System.out.println("链表长度:"+lo.getLength(link));
        //查找第一个数据域为"data2"的节点
        LinkListNoed p = lo.FindElement("data2",link);
        System.out.println("查找方法返回节点数据域为:"+p.getDate());
        //将第一个数据域为"data2"的节点数据域替换为"dataX"
        lo.modifiyElement("data2","dataX",link);
        System.out.println("替换的元素:"+lo.FindElement("dataX",link).getDate());
        System.out.print("已经删除的元素: ");
        System.out.print(String.valueOf(lo.FindElement("data2",link))+"\n");
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值