java实现简单的链表实例教程

链表不同于以前我们学过的队列或数组,它是非线性的,即不是在内存中连续存储的。链表可以理解成由很多结点组成,很多人会把链表比喻为自行车的链条,这一点我觉得有点不怎么适合因为链表也可以是无序的比如张三有李四的电话号码王五也有李四电话号码,那么张三要找王五就只需通过李四就可以了,他们可以是所在位置的不同,当然我这里只是做了一个比喻有可能不太妥当,我们一般将链表的一个结点分成两个部分:Data filed和Pointer field(这些是作者沿用C里的叫法),数据域用来存储数据,域用后面的指针来存放下一个结点的地址。

下面我用一个类来举例我在这里只实现的删除和增加的是功能,为了让代码的简洁我用了一个内部类

 代码如下 复制代码
public class LinkList { 
     
    Node head; 
    Node end; 
    int count; 
     
    public void add(String s){ 
        Node n=new Node(s); 
        if(head==null){ 
            head=n; 
        }else{ 
            end.next=n; 
            n.last=end; 
        } 
        end=n; 
        count++; 
    } 
 
    public void delete(int index){ 
        Node n=getNode(index); 
        Node n2=n.last; 
        Node n3=n.next; 
        if(n2==null){ 
            n3.last=null; 
            head=n3; 
        }else if(n3==null){ 
            n2.next=null; 
            end=n2; 
        }else{ 
            n2.next=n3; 
            n3.last=n2; 
        } 
        count--; 
    } 
     
    // 获得指定位置的元素值 
    public String get(int index){ 
        Node n=getNode(index); 
        String s=n.element; 
        return s; 
    } 
     
    private Node getNode(int index){ 
        if(index<0||index>=size()){ 
            throw new RuntimeException("越界啦。。。"); 
        } 
        int num=0; 
        Node n=head; 
        while(num<index){ 
            n=n.next; 
            num++; 
        } 
        return n; 
    } 
     
    public int size(){ 
        return count; 
    } 
    //内部类 
    class Node{ 
        String element; 
        Node last; 
        Node next; 
        public Node(String element){ 
            this.element=element; 
        } 
    } 
}

add方法:

放入一个节点,如果链表中没有节点就作为头节点,如果有链表中有节点,就将该节点作为尾节点放入。

delete方法:

这里就需要做三次判断,需要判断链表中只有一个节点和两个节点的时候,如果这里不判断当删除的时候,他无法根据前后两个节点来判断你要删除的是那个节点,第三种情况就简单了。

下面我在简单说话所链表和数组的区别(所说的区别也就是用在的场景不同罢了):

从逻辑结构来看
1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。
2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素
从内存存储来看。
(但链表也有区分    按链表的组织形式分有ArrayList和LinkList两种。ArrayList内部其实是用数组的形式实现链表,比较适合链表大小确定或较少对链表进行增删操作的情况,同时对每个链表节点的访问时间都是constant;而LinkList内部以一个List实现链表,比较适合需要频繁对链表进行操作的情况,对链表节点的访问时间与链表长度有关O(N)这里需要具体问题集具体分析了。)

1. (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小
2. 链表从堆中分配空间, 自由度大但是申请管理比较麻烦

从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反, 如果需要经常插入和删除元素就需要用链表数据结构了。

时间: 2024-08-01 10:47:58

java实现简单的链表实例教程的相关文章

java indexOf()简单字符查找实例

java indexof()简单字符查找实例 int indexof(string ch); 就是查找字符/字符串ch在index以后的位置,如果没有找到返回-1;index可以有可以没有,没有时默认为0. eg: string str="liuzheliuxing";        system.out.println((int)'i')                         // i的ascii        system.out.println(str.indexof(

Illustrator简单绘制热气球实例教程分享

给各位Illustrator软件的使用者们来详细的解析分享一下简单绘制热气球的实例教程. 教程分享: 1.首先,使用工具箱中的"矩形工具"画一个矩形,并以天蓝色到白色的渐变色填充矩形,注意不要使用描边色,结果如图1所示.   图1 2.使用"椭圆工具"画一个圆形,并以紫色到白色的渐变色填充,描边色设置为无,然后使用"直接选择工具"拖动圆形下方的锚点,修改圆形的形状,直到得到如图2所示的气球外形.   图2 3.复制并粘贴气球形状,并改变其大小,然

Java中的策略模式实例教程

策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把算法策略作为它的一个参数.使用这种模式最好的例子是Collection.sort()方法了,它使用Comparator对象作为参数.根据Comparator接口不同实现,对象会被不同的方法排序.详细介绍请看java中的排序对象. 本文例子是,完成一个简单地购物车,两种付款策略可供选择,一为信用卡,另

Ajax+PHP简单基础入门实例教程_AJAX相关

首先我们来了解怎么在javascript中创建这个对象: 程序代码 var xmlHttp = new XMLHttpRequest(); 这行简单的代码在 Mozilla.Firefox.Safari.Opera 以及基本上所有以任何形式或方式支持 Ajax 的非 Microsoft 浏览器中,创建了 XMLHttpRequest 对象.但是对于市场占有率达到70%的IE来说,这种方法是不行的,而不同的IE版本还有不同的创建方法,所以我们需要在IE下面使用下面两种创建对象的办法: 程序代码 t

JAVA中的命令模式实例教程

命令模式是一种行为模式,因此,它处理的是对象的行为.命令模式为系统中不同的对象提供中性化的交流媒介.根据GoF的定义,命令模式是: 通过封装一组完全不相关的对象相互之间的的交互及通讯来完成松耦合. 允许某一个对象的行为的变化是独立于其他对象的. 在企业级应用中,命令模式是非常有用的,它使得多个对象可以相互交流.如果一些对象与另一些对象直接交流,系统组件之间是紧耦合的方式.这种方式导致系统具有更高的可维护性,可扩展的灵活性变得很低.命令模式专注于提供一个调解人介于需要交流的对象之间来帮助完成对象间

Java中的状态模式实例教程

原文链接 作者:Pankaj Kumar 译者:f0tlo <1357654289@qq.com> 状态模式是一种行为设计模式.适用于当对象的内在状态改变它自身的行为时. 如果想基于对象的状态来改变自身的行为,通常利用对象的状态变量及if-else条件子句来扮演针对对象的不同行为.状态模式Context(环境)和State(状态)分离的方式既保证状态与行为的联动变化,又使得这种变化是条理明晰且松耦合的. Context是包含了状态引用的类,此引用指向一个状态的具体实现.并且帮助把对状态的请求委

JavaScript+java解析json数据详细实例教程

关于json的概念及优势,我们已经讲过很多次了,不懂的同学可以搜索一下,本文我们主要讲JavaScript如何处理解析JSON数据. 举个简单的例子: js 代码 function showJSON() {        var user =        {        "username":"andy",        "age":20,        "info": { "tel": "1

Ajax+PHP简单基础入门实例教程

首先我们来了解怎么在javascript中创建这个对象: 程序代码 var xmlHttp = new XMLHttpRequest(); 这行简单的代码在 Mozilla.Firefox.Safari.Opera 以及基本上所有以任何形式或方式支持 Ajax 的非 Microsoft 浏览器中,创建了 XMLHttpRequest 对象.但是对于市场占有率达到70%的IE来说,这种方法是不行的,而不同的IE版本还有不同的创建方法,所以我们需要在IE下面使用下面两种创建对象的办法: 程序代码 t

JAVA中的备忘录模式实例教程

备忘录模式是一种行为模式.备忘录模式用于保存对象当前状态,并且在之后可以再次使用此状态.备忘录模式实现的方式需要保证,被保存的对象状态不能被对象从外部访问,目的为了被保存的这些对象状态的完整性. 备忘录模式通过两个对象实现:Originator以及Caretaker.Originator类代表了其状态能够被存储并被用于恢复之前的状态,它使用内部类保存对象的状态.此内部类就被叫做备忘录,注意此类是私有的,它不能被其他对象访问. Caretaker是一个帮助类,它的职责就是通过备忘录帮助Origin