zoukankan      html  css  js  c++  java
  • JAVA单向链表实现

    JAVA单向链表实现

    单向链表

    链表和数组一样是一种最常用的线性数据结构,两者各有优缺点。数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点,由于数组的内存是一次性申请的,就像基本数据类型一样,一次性申请所需的空间,在数据量变动很大的时候就容易导致预先申请的内存不够或内存浪费。在者就是在存的是有序数列时进行数据插入会比较麻烦,所以链表就是为了弥补数组的不足的一种数据结构。相反的,链表对于变动很大的数据有很大的适应性,而且其对于数据插入和删除很方便。而链表的缺点就是对于内存的浪费,链表除了存储需要的数据还要存储额外的指针。链表的节点示意图如下:

     

    看到指针你可能会想:“我们这不是java语言吗?没有指针啊!”,没错!在我对java了解不是很深的时候我也这么想,但是我要说的是java虽然不允许程序员像c/c++那样使用指针,但java语言本身的实现还是离不开指针的(变量名其实就是指向jvm中一块内存的指针,我就不详述)。请看以下节点的代码:

    //节点数据结构
    private class Node{
    private Object data=null;//数据域
    private Node next=null;//下一个节点
    private Node(Object data) {
    this.data=data;
    }
    }

    这里的节点class我是写成inner class的形式,后面有完整代码。还有一点就是这里object类型,这里也可以使用泛型

    //链表数据结构
    public class SingleLinkList {
    int size=0;//链表长度,可有可无,有的话很容易实现很多链表的特殊操作
    Node head=null;//头节点
    public SingleLinkList() {
    this.size=0;this.head=null;
    }
    }

    有了这两个类,然后再来实现链表的一些基本操作:插入头节点,删除头节点,删除指定节点,查找指定节点。直接看完整源代码。

    package singleLinkList;

    public class SingleLinkList {

    int size=0;//链表长度
    Node head=null;

    public SingleLinkList() {
    this.size=0;this.head=null;
    }

    //节点数据结构
    private class Node{
    private Object data=null;//数据域
    private Node next=null;//下一个节点
    private Node(Object data) {
    this.data=data;
    }
    }

    //表头添加元素
    public Object addHead(Object data) {
    Node newHead=new Node(data);
    if(size==0) {
    this.head=newHead;
    }
    else {
    newHead.next=this.head;
    this.head=newHead;
    }
    size++;
    return data;
    }

    //删除表头元素
    public Object deleteHead() {
    if(size>0) {
    Node node=this.head;
    this.head=this.head.next;
    size--;
    }
    return null;
    }

    //查找指定元素
    public Node findData(Object data) {
    if(size==0)return null;
    Node cur=this.head;
    while(cur!=null) {
    if(cur.data.equals(data))return cur;
    cur=cur.next;
    }
    return null;
    }

    //删除指定元素
    public boolean deleteData(Object data) {
    if(size==0)return false;
    Node pre=head;
    Node cur=head;
    while(cur!=null) {
    if(cur.data.equals(data))break;
    pre=cur;cur=cur.next;
    }
    if(cur!=null) {//找到
    if(cur==head) {//找到在头节点
    deleteHead();
    }
    else {
    pre.next=cur.next;
    size--;
    }
    return true;
    }

    return false;
    }

    //判断是否为空
    public boolean isEmpty() {
    return size==0;
    }

    //查看链表内容
    public void display() {
    if(size==0) {
    System.out.println("[]");
    }
    else {
    System.out.print("[");
    System.out.print(head.data);
    Node cur=head;
    while(cur.next!=null) {
    cur=cur.next;
    System.out.print("->");
    System.out.print(cur.data);
    }
    System.out.println("]");
    }
    }

    }

    调用测试的代码就不给出,只给出一个我测试过程的截图:

     

  • 相关阅读:
    数据驱动ddt简单使用
    html-testRunner在unittest测试套件中的使用
    Python设计模式----3.单例模式
    Python设计模式----2.工厂模式
    Python设计模式----1.简单工厂模式
    在小程序中对图片进行缩放时发生的问题记录
    将项目发布到Maven中央仓库的不完整纪要
    虚机的SQL Server空间占满之后进行释放的一些操作
    jdk8环境下,添加重复注解的美好体验
    使用transient关键字解决ehcache序列化错误
  • 原文地址:https://www.cnblogs.com/Davidhwj/p/10433387.html
Copyright © 2011-2022 走看看