资讯专栏INFORMATION COLUMN

Java数据结构与算法——链表

CKJOKER / 2716人阅读

摘要:前言数据结构与算法专题会不定时更新,欢迎各位读者监督。本文介绍另一种数据结构链表,包括链表的特点特点链表的创建删除插入和输出,文末给出代码和一道常见的关于链表的面试题。

声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。

前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本文介绍另一种数据结构——链表,包括链表的特点特点、链表的创建、删除、插入和输出,文末给出java代码和一道常见的关于链表的面试题。

1、链表的概念和特点

链表是由若干结点组成,每个结点至少包括两部分信息:一个是元素数据,一个是指向下一个(上一个)元素地址的指针。链表的存储在物理上是非连续、非顺序的存储结构,数据元素之间是通过每个元素的指针来关联的。

与数组相比,链表独特的存储结构克服了数组提前需要设置长度的缺点,在运行时可以动态的快速的添加和删除元素;计算机的存储空间并非连续的,而链表则可以灵活的使用存储空间,能更好的对计算机内存进行动态管理。

链表分为单链表、双链表、和循环链表,双链表的每个结点有两个指针,分别指向前一个元素和后一个元素,循环链表的尾结点指针不是null,而是指向头结点元素的地址。

2、链表的操作

链表的操作包括了创建、删除、插入、输出。
创建就是空间的分配,将头、尾指针及链表结点个数等初始化。
删除和插入根据被操作元素的位置可以细分为头删除(插入),尾删除(插入),中间删除(插入),以下详细介绍。

创建和输出比较简单,不做具体分析,后面直接给出代码

2.1 插入操作

插入分为头插入,尾插入,中间插入

头插入
头插入实际上是增加一个新节点,然后把新增加的结点指针指向原来头指针指向的元素,再把头指针指向新增的节点。

尾插入
尾插入也是增加一个新节点,该节点指针置为null,然后把原尾结点指针指向新增加的节点,最后把尾指针指向新增加的节点即可。

中间插入
中间插入稍复杂,首先增加一个节点,然后新增节点的指针指向插入位置的后一个节点,把插入位置的前一个节点指针指向新插入节点即可。

2.2 删除操作

删除与插入类似,根据被操作元素的位置分为头删除,尾删除,中间删除

头删除
删除头元素时,先将头指针指向下一个节点,然后把原头结点的指针置空即可

尾删除
删除尾元素时,首先找到链表倒数第2个元素,然后把尾指针指向这个元素,接着把原倒数第2个元素的指针置空。

中间删除
删除中间元素相对复杂一些,首先将要删除的节点的前一个节点指针指向要删除的节点的下一个节点,然后把要删除节点的指针置空。

3、java代码实现

链表是由一系列节点组成,首先是节点部分

public class Node {
    private int data;  //数据
    private Node next;  //指针
    
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }    
}

链表节点部分的代码实现了两个部分,一个是数据,一个是指向下一个节点的指针(由于java中摒弃了c++中的指针概念,准确的说应该是引用)
以下是链表的代码实现:

public class Link {
    private int size = 0;
    private Node first;
    private Node last;
    
    /*链表初始化 */
    public Link(){}
    
    /**
     * 返回链表长度
     * @return 返回链表长度
     */
    public int getLength(){
        return size;
    }
    
    /**
     * 获取指定位置的节点
     * @param index 位置[0~size]
     * @return 
     */
    public Node get(int index){
        Node temp = first;
        for(int i=0;isize){
                throw new IndexOutOfBoundsException("删除位置超界");
            }else{
                Node temp = get(index-1);
                temp.setNext(get(index));
                temp.setNext(null);
                size--;
            }
        }
    }
    
    /**
     * 获取链表
     */
    public void getAll(){
        Node temp = first;
        System.out.println(temp.getData());
        while(temp.getNext()!=null){
            System.out.print(temp.getData()+"-->");
            temp = temp.getNext();
            size--;
        }
    }    
}
4、测试代码
public class LinkTest {
    public static void main(String[] args) {
        Link link = new Link();
        link.addHead(1); //1
        link.printLink();
        
        link.addHead(5); //5->1
        link.printLink();
        
        link.addTail(9); //5->1->9
        link.printLink();
        
        link.addTail(7); //5->1->9->7
        link.printLink();
        
        link.add(3,8);  //5->1->9->8->7
        link.printLink();        
        System.out.println("链表长度:"+link.getLength()); //5
        
        link.deleFirst();  //1->9->8->7
        link.printLink();
        
        link.deleLast();  //1->9->8
        link.printLink();
        
        link.deleMid(1);  //1->8
        link.printLink();
        
        System.out.println("链表长度:"+link.getLength()); //2        
    }
}
5.小结

链表的操作稍稍复杂,插入和删除要考虑很多因素(边界条件、异常),写完代码要逐个测试,出现不一致的情况逐步调试、跟踪变量。记住插入和删除的步骤(六张图),编码时仔细一点一般不会出现问题。

以上代码经过测试无误,欢迎收藏转发,欢迎下方讨论交流^_^
码字——>画图——>编码——>调试 一趟下来不容易,如果对您有帮助请收藏点赞

更新:我的另一篇的文章Java数据结构与算法——链表面试介绍了链表的特点,使用场景、链表的性能分析以及一道经典的链表面试题——链的反转问题,请移步阅读参考。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71039.html

相关文章

  • Java数据结构算法——链表(面试)

    摘要:前言数据结构与算法专题会不定时更新,欢迎各位读者监督。指针反转实现链表反转代码反转链表获取当前下下个元素测试代码部分用到了上篇文章数据结构与算法链表的代码段,请移步获取。 声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本文是上篇文章Java数据结构与算法——链表的扩展篇,介绍链表的特点,使用场景、链表的性能分析以...

    keke 评论0 收藏0
  • 数据结构 - 收藏集 - 掘金

    面试旧敌之红黑树(直白介绍深入理解) - Android - 掘金 读完本文你将了解到: 什么是红黑树 黑色高度 红黑树的 5 个特性 红黑树的左旋右旋 指定节点 x 的左旋 右图转成左图 指定节点 y 的右旋左图转成右图 红黑树的平衡插入 二叉查找树的插入 插入后调整红黑树结构 调整思想 插入染红后... java 多线程同步以及线程间通信详解 & 消费者生产者模式 & 死锁 & Thread...

    leeon 评论0 收藏0
  • Java实现单向链表基本功能

    摘要:一前言最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了。 一、前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了。数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用~ 本文主要讲解单链表的基础知识点,做一个简单的入门~如果有错的地方请指正 二、回顾与知新 说起链表,我们先提一下数组吧,跟数组比较一下就很理解链...

    idisfkj 评论0 收藏0

发表评论

0条评论

CKJOKER

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<