java单链表的实现自己动手写一个单链表

单链表:单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
自己手动写一个单链表:
首先,定义一个节点类:

package com.wei;

public class Link {
    public int data;// 存放数据
    public Link next;// 存放下一个节点

    public Link(int data) {
        this.data = data;
    }

    public Link(int data, Link next) {
        this.data = data;
        this.next = next;
    }

    public Link() {
    }

    public void display() {
        System.out.println(data + " ");
    }
}

第二部分是定义一个链表类:

package com.wei;

public class LinkList {

    public Link frist;// 定义一个头节点
    public Link last;//尾指针永远指向头节点
    public int size = 0;// 节点的位置

    public LinkList() {
        this.frist = null;//
    }

    /**
     * 判断链表是否为空
     *
     * @return
     */
    public boolean isis() {
        return size == 0;
    }

    /**
     * 头插法
     *
     * @param data
     */
    public void addfrist(int data) {
        Link L = new Link(data);
        L.next = frist;
        frist = L;
        size++;
    }

    /**
     * 尾插法
     *
     * @param data
     */
    public void addlast(int data) {

        if (frist == null) {
            frist = new Link(data);
            last = frist;
        } else {
            Link newL = new Link(data);
            last.next = newL;
            last = newL;
        }
        size++;
    }

    /**
     * 从头删除
     *
     * @return
     */
    public Link removefrist() {
        Link d = frist;
        frist = d.next;
        size--;
        return d;
    }

    /**
     * 删除最后一个
     */
    public void dellast() {
        Dell(size - 1);
    }

    /**
     * 获取链表长度
     */
    public void displayAllLink() {
        Link cure = frist;
        while (cure != null) {
            cure.display();
            cure = cure.next;
        }
        System.out.println("长度" + size);
    }

    /**
     * 获取指定位置的节点元素
     *
     * @param index
     * @return
     */
    public Link getData(int index) {
        if (index < 0 && index > size - 1) {
            throw new IndexOutOfBoundsException("越界");
        }
        Link count = frist;
        for (int i = 0; i < size && count != null; i++, count = count.next) {
            if (i == index) {
                return count;
            }
        }
        return null;
    }

    /**
     * 按值查找指定位置
     *
     * @param element
     * @return
     */
    public int selectIndex(int element) {
        Link current = frist;
        for (int i = 0; i < size && current != null; i++, current = current.next) {
            if (current.data == element) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 删除链表中数值最大的元素
     */
    public void delMax() {
        // 要遍历的链表
        Link cu = frist;
        // 初始化一个节点,当中间变量
        Link cc = new Link(0);
        // 遍历
        for (int i = 0; i < size && cu != null; i++, cu = cu.next) {
            if (cu.data > cc.data) {
                cc.data = cu.data;
            }
        }
        int data = cc.data;
        int number = selectIndex(data);
        Dell(number);
    }

    /**
     * 删除链表中数值最小的元素
     */
    public void delMin() {
        // 要遍历的链表
        Link cu = frist;
        // 初始化一个节点,当中间变量
        Link cc = new Link(0);
        // 遍历
        for (int i = 0; i < size && cu != null; i++, cu = cu.next) {
            if (cu.data < cc.data) {
                cc.data = cu.data;
            }
        }
        int data = cc.data;
        int number = selectIndex(data);
        Dell(number);
    }

    /**
     * 从指定位置处插入数据
     *
     * @param t
     * @param index
     */
    public void insert(int t, int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("索引超出线性表范围");
        }
        if (frist == null) {
            addlast(t);
        } else {
            if (index == 0) {
                addfrist(t);
            } else {
                Link k = getData(index - 1);
                k.next = new Link(t, k.next);
                size++;
            }

        }
    }

    /**
     * 从指定位置处删除
     *
     * @param index
     */
    public void Dell(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("索引超出线性表范围");
        }
        Link del = null;
        if (index == 0) {
            del = frist.next;
            frist = frist.next;
        } else {
            Link neL = getData(index - 1);
            del = neL.next;
            neL.next = del.next;
            del.next = null;
        }
        size--;
    }

    /**
     * 清空链表
     */
    public void clear() {
        frist = null;
        last = null;
        size = 0;
    }

    /**
     * 按从小到大排序
     */
    public void Min_to_Max() {
        // 要遍历的链表
        Link cu = frist;
        // 记录最小值
        int min;
        while (cu != null) {
            // 内重循环从当前节点的下一个节点循环到尾节点,找到和外重循环的值比较最小的那个,然后与外重循环进行交换
            Link nextLink = cu.next;
            while (nextLink != null) {
                // 比外循环小的值放在前面
                if (nextLink.data < cu.data) {
                    min = nextLink.data;
                    nextLink.data = cu.data;
                    cu.data = min;
                }
                nextLink = nextLink.next;
            }
            cu = cu.next;
        }

    }

    /**
     * 按从大到大排序
     */
    public void Max_to_Min() {
        // 要遍历的链表
        Link cu = frist;
        // 记录最小值
        int min;
        while (cu != null) {
            // 内重循环从当前节点的下一个节点循环到尾节点
            //找到和外重循环的值比较最小的那个,然后与外重循环进行交换
            Link nextLink = cu.next;
            while (nextLink != null) {
                // 比外循环小的值放在前面
                if (nextLink.data > cu.data) {
                    min = nextLink.data;
                    nextLink.data = cu.data;
                    cu.data = min;
                }
                nextLink = nextLink.next;
            }
            cu = cu.next;
        }

    }

}

最后是测试类:

package com.wei;

public class Test {

    public static void main(String [] arr) {
        LinkList g = new LinkList();
        g.addlast(13);
        g.addlast(16);
        g.addlast(-3);
        g.addlast(8);
        g.addlast(5);
        g.addlast(22);
        g.Min_to_Max();
        g.displayAllLink();
        g.Max_to_Min();
        g.displayAllLink();
    }
}

一条链表就这样写完了,需要什么功能可以自己扩展。

原文地址:https://www.cnblogs.com/weijianyi/p/11599503.html

时间: 2024-10-24 11:12:50

java单链表的实现自己动手写一个单链表的相关文章

死磕 java线程系列之自己动手写一个线程池

欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写的线程池如何测试? 简介 线程池是Java并发编程中经常使用到的技术,那么自己如何动手写一个线程池呢?本文彤哥将手把手带你写一个可用的线程池. 属性分析 线程池,顾名思义它首先是一个"池",这个池里面放的是线程,线程是用来执行任务的. 首先,线程池中的线程应该是有类别的,有的是核心线程,有

模拟spring - 动手写一个spring AOP

一.前言 AOP (Aspect Oriented Programing) - 面向切面编程,它主要用于日志记录.性能分析.安全控制.事务处理.异常处理等方面. AOP主要使用JDK的反射和动态代理,AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用,AOP代理包含了目标对象的全部方法,但AOP代理的方法与目标对象的方法存在差异:AOP方法在特定切入点添加了增强处理,并回调了目标对象的方法. 动态代理的文章请参考:http://blog.csdn.net/zdp072/ar

动手写一个Remoting测试工具

基于.NET开发分布式系统,经常用到Remoting技术.在测试驱动开发流行的今天,如果针对分布式系统中的每个Remoting接口的每个方法都要写详细的测试脚本,无疑非常浪费时间.所以,我想写一个能自动测试remoting接口的小工具InterfaceTester.而且,当分布式系统中的某个remoting接口出现bug时,该小工具可以提交需要模拟的数据,以便在调试remoting服务的环境中,快速定位和解决bug. InterfaceTester运行起来后的效果如下图: 1.如何使用 (1)首

关于java写一个单例类(面试手写题)

package com.shundong.javacore; /** * java写一个简单的单例类 * @author shundong * */ class Singleton { //使用一个类变量来缓存曾经创建的实例 private static Singleton instance; //对构造进行隐藏(private) private Singleton(){} /** * 提供一个静态方法 * 该方法加入了自定义控制 保证只产生一个Singleton对象 * @return 返回S

死磕 java线程系列之自己动手写一个线程池(续)

(手机横屏看源码更方便) 问题 (1)自己动手写的线程池如何支持带返回值的任务呢? (2)如果任务执行的过程中抛出异常了该怎么处理呢? 简介 上一章我们自己动手写了一个线程池,但是它是不支持带返回值的任务的,那么,我们自己能否实现呢?必须可以,今天我们就一起来实现带返回值任务的线程池. 前情回顾 首先,让我们先回顾一下上一章写的线程池: (1)它包含四个要素:核心线程数.最大线程数.任务队列.拒绝策略: (2)它具有执行无返回值任务的能力: (3)它无法处理有返回值的任务: (4)它无法处理任务

自己动手写一个FTP客户端

自己用socket写一个FTP客户端,模拟主动被动模式.(先支持LIST命令) # -*- coding: utf-8 -*- import socket, sys, thread, threading def main_sock(daddr, actions, saddr=()):     if saddr:         try:             sc=socket.create_connection(daddr, 3, saddr)             #print "Now

自己动手写一个iOS 网络请求库的三部曲[转]

代码示例:https://github.com/johnlui/Swift-On-iOS/blob/master/BuildYourHTTPRequestLibrary 开源项目:Pitaya,适合大文件上传的 HTTP 请求库:https://github.com/johnlui/Pitaya 本系列文章中,我们将尝试使用 NSURLSession 技术构建一个自己的网络请求库. NSURLSession 简介 NSURLSession 是 iOS7 引入的新网络请求接口,在 WWDC2013

操刀 requirejs,自己动手写一个

前沿 写在文章的最前面 这篇文章讲的是,我怎么去写一个 requirejs . 去 github 上fork一下,顺便star~ requirejs,众所周知,是一个非常出名的js模块化工具,可以让你使用模块化的方式组织代码,并异步加载你所需要的部分.balabala 等等好处不计其数. 之所以写这篇文章,是做一个总结.目前打算动一动,换一份工作.感谢 一线码农 大大帮忙推了携程,得到了面试的机会. 面试的时候,聊着聊着感觉问题都问在了自己的“点”上,应答都挺顺利,于是就慢慢膨胀了.在说到模块化

动手写一个Remoting接口测试工具(附源码下载)

基于.NET开发分布式系统,经常用到Remoting技术.在测试驱动开发流行的今天,如果针对分布式系统中的每个Remoting接口的每个方法都要写详细的测试脚本,无疑非常浪费时间.所以,我想写一个能自动测试remoting接口的小工具InterfaceTester.而且,当分布式系统中的某个remoting接口出现bug时,该小工具可以提交需要模拟的数据,以便在调试remoting服务的环境中,快速定位和解决bug. InterfaceTester运行起来后的效果如下图: 1.如何使用 (1)首