Java 数据结构 单向链表

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));
    }

}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值