数据结构(3)-链表(1)


前面的文章中介绍了数组这种应用最广泛的数据结构,数组的使用很简单,但是数组存在着诸多不足,例如在无序数组中的查询时间复杂度为O(n),在有序数组数组中,插入的时间复杂度为O(n);本篇将介绍另一种应用广泛的数据结构-链表(LinkList),它在某些数据结构的实现中可以取代数组。

一、什么是链表

链表(LinkList)是一种数据结构。在链表中,每个数据项被包含在链结点Link中,每个Link结点实际上就是一个结点对象,它包含了对前一个结点的引用(preLink)和后一个结点(postLink)的引用,通过这个引用关系,将一个个结点Link串联成链表ListList
示意图

二、用Java构造一个链表

1、链表结点Link的构造:
//链表结点
    static class Link{
        public int data;//结点中存储的数据
        public Link next;//下一个结点
        //含参构造方法
        public Link(int  data){
            this.data = data;
        }

        //遍历链表
        public void displayLink(){
            System.out.print(this.data+"->");
        }
    }
2、链表LinkList的构造:
public class LinkList {
    //第一个链结点
    private Link first;
    //含参构造,将first赋为null
    public LinkList(){
        this.first = null;
    }


    //判断链表是否为空
    public boolean isEmpty(){
        return (this.first == null);
    }

    //插入链头结点
    public void insertFirst(int data){
        Link linkFirst = new Link(data);
        linkFirst.next = this.first;//linkHead -> old first
        this.first = linkFirst;//new first -> linkHead
    }
    }

insertHead方法

3、deleteFirst方法
//删除链头
    public void deleteFirst(){
        this.first = this.first.next;
    }
4、遍历链结点
 //遍历链表
    public void displayLinkList(){
        Link current = this.first;//从链头开始遍历
        while (current != null){
            //当前链结点不为空即输出内容
            current.displayLink();
            //将当前链结点指向下一个链结点
            current = current.next;
        }
    }
5、完整程序:
package com.example.demo;

/**
 * @Description:LinkList Demo
 * @CreateDate: Created in 2018/10/8 23:05
 * @Author: <a href="https://blog.csdn.net/pbrlovejava">arong</a>
 */
public class LinkList {
    //第一个链结点
    private Link first;
    //含参构造,将first赋为null
    public LinkList(){
        this.first = null;
    }


    //判断链表是否为空
    public boolean isEmpty(){
        return (this.first == null);
    }

    //插入链头结点
    public void insertFirst(int data){
        Link linkFirst = new Link(data);
        linkFirst.next = this.first;//linkHead -> old first
        this.first = linkFirst;//new first -> linkHead
    }

    //遍历链表
    public void displayLinkList(){
        Link current = this.first;//从链头开始遍历
        while (current != null){
            //当前链结点不为空即输出内容
            current.displayLink();
            //将当前链结点指向下一个链结点
            current = current.next;
        }
    }

    //删除链头
    public void deleteFirst(){
        this.first = this.first.next;
    }

    //链表结点
    static class Link{
        public int data;//结点中存储的数据
        public Link next;//下一个结点
        //含参构造方法
        public Link(int  data){
            this.data = data;
        }

        //输出链结点
        public void displayLink(){
            System.out.print(this.data+"->");
        }
    }

}
6、测试链表:
@Test
    public void fun1(){
        LinkList linkList = new LinkList();
        linkList.insertFirst(1);
        linkList.insertFirst(2);
        linkList.insertFirst(3);
        linkList.insertFirst(4);
        linkList.insertFirst(5);
        System.out.println("遍历1");
        linkList.displayLinkList();
        System.out.println("删除两个链头");
        linkList.deleteFirst();
        linkList.deleteFirst();
        System.out.println("遍历2");
        linkList.displayLinkList();

    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringError

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值