美文网首页Java数据结构
Java 数据结构 单向链表

Java 数据结构 单向链表

作者: Sheldonlv | 来源:发表于2019-04-03 20:55 被阅读14次

Java 数据结构 单向链表

基础介绍

链表与循序表都是同属于数据结构中顺序表中的一种,而它与循序表的不同就在于

链表:添加、删除结点快,查询慢(数据大的时候)
循序表:查询快,添加删除数据慢(数据量大的时候要移动大量的数据)

所以在平常的程序编写中,对于这两种数据结构的使用需要思考过后再决定。

单向链表结构

在这里插入图片描述
最基础的单向链表结构就是由数据+地址组成的。

数据部分:保存的是该结点的实际数据
地址部分:保存下一个结点的地址

在进行链表操作的时候,需要定义一个头引用变量,该引用变量指向链表结构的第一个结点,第一个结点的地址部分又指向第二个结点、、、如此反复循环下去直到最后一个结点的地址部分不再指向其他结点,该结点也正是表尾,一般表尾的地址部分放一个空地址null。从表结构中可以看出,整个表就如同一个长链一样,也正因为如此,所以链表的查询过程比较循序链表更加的费时。

以下是Java的实现代码:

package linklist;

/**
 * 链表结构(单向)
 * Created by Sheldon on 2019/3/29.
 * Project Name: alstudy.
 * Package Name: linklist.
 */

// 数据对象
class Data{
    String key;
    String name;

    Data(){ }

    Data(String key, String name){
        this.key = key;
        this.name = name;
    }
}

// 单向链表
class NodeOne{
    Data data;
    NodeOne nextNode;
}

// 单向链表操作类
public class LinkListOne {

    // 插入头结点
    public NodeOne addFirst(NodeOne head, Data data){
        NodeOne node;
        // 创建对象
        if ((node = new NodeOne())==null){
            System.out.println("分配内存失败");
            return head;
        }else {
            // 保存数据
            node.data = data;
            // 该引用指向原本的头引用
            node.nextNode = head;
            return node;
        }
    }

    // 追加结点
    public NodeOne addData(NodeOne head, Data data){
        NodeOne node, temp;
        // 创建结点对象
        if ((node=new NodeOne())==null){
            System.out.println("对象创建失败");
            return null;
        }else {
            // 保存数据
            node.data = data;
            // 设置下一个结点为空
            node.nextNode = null;
            // 检测头部是否为空
            if (head==null){
                head = node;
                return head;
            }
            // 头部不为空就查找尾部
            temp = head;
            while (temp.nextNode!=null){
                temp = temp.nextNode;
            }
            temp.nextNode = node;
            return head;
        }
    }

    // 插入结点
    public boolean insertNode(NodeOne head, String key, Data data){
        NodeOne node = head;
        NodeOne temp = head;
        while (temp!=null){
            if (temp.data.key.equals(key)){
                temp.data = data;
                return true;
            }else {
                temp = temp.nextNode;
            }
        }
        return false;
    }

    // 链表反转
    public NodeOne reversal(NodeOne head){
        NodeOne newHead = null;
        NodeOne temp = null;
        while (head!=null){
            temp = head.nextNode;
            head.nextNode = newHead;
            newHead = head;
            head = temp;
        }
        return newHead;
    }

    // 查找结点
    public NodeOne findNode(NodeOne head, String key){
        NodeOne node = head;
        // 遍历链表数据
        while (node!=null){
            // 对比数据
            if (node.data.key.equals(key)){
                System.out.println(node.data.key+"->"+node.data.name+" ");
                return node;
            }else {
                node = node.nextNode;
            }
        }
        return null;
    }

    // 删除结点
    public NodeOne delList(NodeOne head, String key){
        NodeOne node = head;
        NodeOne temp = head;
        while (temp!=null){
            // 查找关键字
            if (temp.data.key.equals(key)){
                // 将头结点的引用指向关键字的下一个引用
                node.nextNode = temp.nextNode;
                return head;
            }else {
                node = temp;
                // 指向下一个引用
                temp = temp.nextNode;
            }
        }
        return head;
    }

    // 清空链表
    public NodeOne cleadList(NodeOne head){
        return null;
    }

    // 计算链表长度
    public int listSize(NodeOne head){
        int size=0;
        NodeOne node = head;
        // 遍历链表
        while (node!=null){
            // 大小+1
            ++size;
            node = node.nextNode;
        }
        return size;
    }

    // 显示所有结点
    public void showAllList(NodeOne head){
        NodeOne node = head;
        // 遍历链表
        while (node!=null){
            // 打印结点信息
            System.out.printf(node.data.key+"->"+node.data.name+" ");
            node = node.nextNode;
        }
        System.out.println();
    }

    // 测试验证
    public static void main(String[] args) {
        // 创建链表操作对象
        LinkListOne listOne = new LinkListOne();
        // 创建头结点对象
        NodeOne headNode = null;
        // 添加链表对象
        headNode = listOne.addData(headNode, new Data("1","小明"));
        listOne.addData(headNode, new Data("2","小红"));
        listOne.addData(headNode, new Data("3","小兵"));
        listOne.addData(headNode, new Data("4","小黄"));
        // 查看链表数据
        listOne.showAllList(headNode);
        // 新增头引用
        headNode = listOne.addFirst(headNode, new Data("0","小清"));
        // 查看链表数据
        listOne.showAllList(headNode);
        // 链表翻转
        headNode = listOne.reversal(headNode);
        // 查看链表数据
        listOne.showAllList(headNode);
        // 删除链表
        headNode = listOne.delList(headNode, "2");
        // 再查看链表数据
        listOne.showAllList(headNode);
        // 查找单个数据
        listOne.findNode(headNode, "1");
        // 插入数据
        listOne.insertNode(headNode, "1", new Data("1","新小明"));
        // 再查看链表数据
        listOne.showAllList(headNode);
        // 清空链表
        headNode = listOne.cleadList(headNode);
        // 查看链表数据数量情况
        System.out.println(listOne.listSize(headNode));
    }

}

运行结果


在这里插入图片描述

相关文章

  • 数据结构 | 其二 链表

    冰河winner - 数据结构之链表 2.1 单向链表 数据结构(一) 单链表的实现-JAVA 2.2 双端链表 ...

  • 用Java写单向链表

    数据结构—单向链表 为了巩固自己的基础知识,这次就用 Java 来写一个单向链表。问:什么是单向链表?首先链表是数...

  • 算法与数据结构-链表((linked-list)-Java实现单

    title: 算法与数据结构-链表((linked-list)-Java实现单向链表 date: 2019-02-...

  • 算法与数据结构知识汇总(二、链表)

    1、概念 2、链表的数据结构 单向链表的数据结构如下图: 上图数据结构为单向链表,简称单链表,该数据结构由若干个节...

  • 链表

    一、单向链表 单向链表的普通实现 Java实现: Kotlin实现: 单向链表的递归实现 Java实现: 二、双向...

  • 2019-12-04 Java-LinkedList源码解读

    @TOC 1、链表数据结构 链表分为单向链表和双向链表,他们的区别在于,单向链表只能单向寻址,而双向链表可以双向寻...

  • Java 数据结构 单向链表

    Java 数据结构 单向链表 基础介绍 链表与循序表都是同属于数据结构中顺序表中的一种,而它与循序表的不同就在于 ...

  • 线性表-单向循环链表

    单向循环链表 单向循环链表示意图如下: 数据结构定义(同普通链表) 单向循环链表初始化与赋值 在上面循环遍历查找尾...

  • Java 数据结构 循环链表

    Java 数据结构 循环链表 简介 循环链表与前两篇文章所提及的单向链表及双向链表也并没有太多不同的地方,只是其尾...

  • 数据结构笔记

    数据结构课程概览 ================== 1.顺序表 2.链表:单链表,单向循环链表,双链表...

网友评论

    本文标题:Java 数据结构 单向链表

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