美文网首页
Java实现单链表以及链表的基本操作

Java实现单链表以及链表的基本操作

作者: 浅蓝色的麻吉 | 来源:发表于2018-10-09 18:16 被阅读0次

Github issues:https://github.com/littlejoyo/Blog/issues/

个人博客:https://littlejoyo.github.io/

微信公众号:Joyo说

链表是基本的数据结构,笔试或者面试的时候也是常常考察的内容,所以实现一个简单的单链表以及对链表的基本操作要学会信手拈来,面试的时候才能临危不惧吧,加油。

单链表的结构

单链表结构

上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。

代码实现单链表

链表节点的定义

链表是由一个个节点连接形成的,所以要先定义好节点类,节点类主要分为两块内容就是数据和next指针,定义可以参看下面代码:

public class LinkListDemo {

    //节点类
    private class ListNode {
        private Object data;
        private ListNode next = null;

        ListNode() {
            data = null;
        }

        ListNode(Object data) {
            this.data = data;
        }
    }

    private ListNode head;//头节点
    private ListNode temp;//临时节点


    //初始化链表,生成一个无数据的头节点
    LinkListDemo() {
        head = new ListNode();
    }
}

给链表添加节点

/* ================以下方法是对链表的操作===================*/

    /**
     * 增加节点
     *
     * @param data
     */
    public void addNode(Object data) {
        ListNode node = new ListNode(data);
        temp = head;
        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = node;

    }

对于插入节点常用的思想主要有头插法尾插法,使用尾插法的话需要再定义一个尾指针来区分。下面可以通过对比讨论他们的不同:

头插法和尾插法的对比

返回链表的长度

/**
     * 返回链表的长度
     * @return
     */
    public int getLength()
    {
        temp = head;
        int length = 0;
        while (temp.next!=null)
        {
            length++;
            temp = temp.next;
        }
        return length;
    }

增加节点到链表指定的位置

对于传入的index需要先判断是否合法,然后通过while循环的遍历寻找index的位置来进行节点的插入。

/**
     * 增加节点到指定的位置
     *
     * @param index
     * @param data
     */
    public void addNodeByIndex(int index, Object data) {
        if (index < 1 || index > getLength() + 1) {
            System.out.println("插入的位置不合法。");
            return;
        }
        int count = 1; //记录遍历的位置
        ListNode node = new ListNode(data);
        temp = head;
        while (temp.next != null) {
            if (index == count++) {
                node.next = temp.next;
                temp.next = node;
                return;
            }
            temp = temp.next;
        }

    }

删除链表指定位置的节点

实现的思路和上面的相似,只是增删节点的处理过程不相同。

 /**
     * 删除指定位置的节点
     *
     * @param index
     */
    public void deleteByIndex(int index) {
        if (index < 1 || index > getLength()) {
            System.out.println("插入的位置不合法。");
            return;
        }

        int count = 1;//记录位置
        temp = head;
        while (temp.next != null) {
            if (index == count++) {
                temp.next = temp.next.next;
                return;
            }
            temp = temp.next;
        }

    }

从头到尾打印链表的数据

/**
     * 从头到尾打印节点
     */
    public void printListFromHead() {
        temp = head;
        while (temp.next != null) {
            System.out.print("{" + temp.next.data + "}");
            temp = temp.next;
        }
        System.out.println();

    }

从尾到头打印链表的数据

这里可以利用栈的后进先出的存储特点来实现。

/**
     * 从头到尾打印节点
     */
    public void printListFromHead() {
        temp = head;
        while (temp.next != null) {
            System.out.print("{" + temp.next.data + "}");
            temp = temp.next;
        }
        System.out.println();

    }

测试链表是否能成功建立以及各个方法能否实现

 public static void main(String[] args)
    {
        LinkListDemo list = new LinkListDemo();
        list.addNode(1);
        list.addNode(2);
        list.addNode(3);
        list.addNode(4);
        list.addNode(5);
        list.printListFromHead();
        list.addNodeByIndex(3,2.8);
        list.printListFromHead();
        list.deleteByIndex(3);
        list.printListFromHead();
        list.printFromTail();
        System.out.println(list.getLength());
    }

输出结果:

{1}{2}{3}{4}{5}
{1}{2}{2.8}{3}{4}{5}
{1}{2}{3}{4}{5}
{5}{4}{3}{2}{1}
5

微信公众号

扫一扫关注Joyo说公众号,共同学习和研究开发技术。

关注我

相关文章

  • Java实现单链表以及链表的基本操作

    Github issues:https://github.com/littlejoyo/Blog/issues/ ...

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • 数据结构与算法之链表(五)双链表实现

    引言 前面几篇文章详细学习了单链表的操作,有了这个基础,双链表的实现便水到渠成。由于它的基本实现和单链表基本一样,...

  • 线性表之单链表实现

    线性表之单链表实现 实现单链表的初始化、插入、删除等基本运算 实现单链表的输入、输出运算 实现单链表的逆置、归并、...

  • 算法&单链表反转(三)

    主要介绍链表的简单用法以及单链表反转。网上的实现有很多,使用 OC/C 来实现的没有几个。 一、链表的基本用法 链...

  • [源码和文档分享]基于QT实现的可视化链表(单链表、循环链表、双

    1.1 题目 题号1:分别以单链表、循环链表、双向链表为例,实现线性表的建立、插入、删除、查找等基本操作。 要求:...

  • LeetCode2

    用链表表示整数,求其相加得到的结果。考察基本的链表操作。因为用的是Java刷题,所以要清楚Java的链表实现。Ja...

  • 链表问题集锦

    1.单链表的初始化,输出以及插入删除的基本操作 2.在O(1)时间删除链表节点 3.反转单链表 4.求链表倒数第k...

  • 链表相关

    总结一下链表相关的操作 单链表节点的定义 实现单向链表的反向 删除单链表的所有节点

  • 2018-12-01

    数据结构使用二级指针创建单链表以及单链表的各种操作 //单链表创建 #include #include #incl...

网友评论

      本文标题:Java实现单链表以及链表的基本操作

      本文链接:https://www.haomeiwen.com/subject/xvsyaftx.html