链表:一、 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:
1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间。并把原有的数据元素复制进新的存储空间。
2. 因为顺序表要求数据的存储位置不仅是逻辑上相邻而且物理存储上也要相邻,所以当对数据进行增删操作的时候则会引起平均一半的数据元素移动。
综上所述:适合静态存储、对数据元素很少增删操作,则优先选择顺序表,对需要对数据频繁执行插入和删除操作,则选择动态的线性表-链表,链式存储不需要逻辑上相邻的元
素物理上也相邻,所以链表也带来了一定的局限性,失去了随机存取的特点。所以根据需求进行选择。
二、使用JAVA实现单链表:接口同顺序表:

[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.usts.edu.list;
  
/**
 * Created by Guanzhong Hu
 * Date :2019/12/27
 * Description : 线性表
 * Version :1.0
 */
public interface Ilist {
  
//    将已存在的线性表置空
    public void clear();
  
//    判断是否为空
    public boolean isEmpty();
  
//    求线性表中数据元素个数并返回其值
    public int length();
  
//    读取第i个元素的值 区间:[0,length()-1]
    public Object get(int i) throws Exception;
  
//    插入元素,i表示插入的地址取值 区间:[0,length()-1],当为length()-1时,表示在表尾插入x
    public void insert(int i,Object x) throws Exception;
  
//    删除位于第i个的元素
    public void remove(int i) throws Exception;
  
//    返回线性表中元素第一次出现的index
    public int indexOf(Object x) throws Exception;
  
//    输出线性表中各个数据元素的值
    public void display();
  
  
}
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.usts.edu.list;
  
/**
 * Created by Guanzhong Hu
 * Date :2019/12/27
 * Description :单链表
 * Version :1.0
 */
public class Node {
    /**
     * 采用链式存储方式存储的线性表成为单链表
     * 1. 链表中每一个结点包含存放数据元素值的数据域和存放指向逻辑上相邻结点的指针域
     * 2. 若节点中只包含一个指针域,则称此链表为单链表
     */
    public Object data;//存放结点值
  
    public Node next; // 存放逻辑指针
  
    public Node(){
        this(null,null);// 置空
    }
//  两个参数的单链表
    public Node(Object data, Node next) {
        this.data = data;
        this.next = next;
    }
  
    // 带一个参数的单链表
    public Node(Object data){
        this(data,null);
    }
}
[Java] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.usts.edu.list;
  
import java.math.BigInteger;
import java.util.Scanner;
  
/**
 * Created by Guanzhong Hu
 * Date :2019/12/27
 * Description :实现单链表
 * Version :1.0
 */
public class LinkList implements Ilist {
  
    private  Node head;
  
    public LinkList() {
        head = new Node();// 生成空的单链表
    }
  
//  置空
    @Override
    public void clear() {
        head.data = null;
        head.next = null;
    }
  
    @Override
    public boolean isEmpty() {
        return head.next==null; // 头指针为null,则空
    }
  
    @Override
    public int length() {
        int length = 0;// 初始化length
        Node n = head.next; // 初始化头指针,进行遍历
        while (n != null){
            n = n.next; // 迭代遍历
            length++;
        }
        return length;
    }
  
    @Override
    public Object get(int i) throws Exception {
        Node n = head.next;
        int flag = 0;// 初始化查找参数,依次遍历寻找,当存在下一个头指针且flag = i时,则返回当前指针指向的下一个元素
        while (n != null && i > flag){
            n = n.next;
            flag++;
        }
        if (n==null|| i<flag){
            throw  new Exception("查找的第"+i+"个元素不存在!");
        }
        return n.data;
    }
  
    @Override
    public void insert(int i, Object x) throws Exception {
        Node p = head;
        int flag = -1; // 定义计数器,从-1开始,因为第一个元素的头指针是-1;
        while (p!=null&&flag<i-1){ //寻找第i个结点的前驱,如果前驱小于则可以插入,否则当前元素位置已经占
            p = p.next;// 已经指向当前结点的位置,需要后期插入成功后,指向下一个结点位置
            flag++;
        }
        if (p==null&&flag>i-1) throw new Exception("插入位置不合法");
        Node newNode = new Node(x);
        newNode.next = p.next; // 指向下一个结点位置
        p.next = newNode;// 将当前生成的结点(下一个结点指针,当前节点元素)存入p的上一个结点的下一个结点的指针中
    }
  
    @Override
    public void remove(int i) throws Exception {
        Node p = head;
        int flag = -1; // 同上
        while (p!=null&&flag<i-1){
            p = p.next;
            flag ++;
        }
        if (p==null&&flag>i-1) throw new Exception("删除位置不合法");
        p.next = p.next.next;// 将此节点的上一个节点的指针指向当前删除节点的下一个结点
    }
  
    @Override
    public int indexOf(Object x) throws Exception {
        Node p = head;
        int flag = -1;
        while (p!=null&&p.data.equals(x)){
            p = p.next;
            flag ++;
        }
        if (p!=null) return flag;
        return -1;
  
    }
  
    @Override
    public void display() {
        Node p = head.next;
//        如果指针含有下一个元素,则输出,并替换查询指针
        while (p!=null){
            System.out.print(p.data);
            p = p.next;
        }
        System.out.println();
    }
    //创建链表,测试使用
    public void createLinkList(int len) throws Exception{ // 头插法,创建len长度的链表
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < len ; i++) {
            insert(0,scanner.next());
        }
    }
}
[Java] 纯文本查看 复制代码
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.usts.edu.list;
  
import java.util.Scanner;
  
/**
 * Created by Guanzhong Hu
 * Date :2019/12/27
 * Description : 测试单链表
 * Version :1.0
 */
public class ExampleLinkListTest {
  
    public static void main(String[] args) throws Exception {
        int len = 10;
        LinkList linkList = new LinkList();
//        利用for生成链表
        for (int i = 0; i < len ; i++) {
            linkList.insert(i,i);
        }
        System.out.println("请输入查找的值");
        int i = new Scanner(System.in).nextInt();
        if (i>0&&i<=len) System.out.println("第"+i+"个元素的直接前驱"+linkList.get(i-1));
        linkList.display();
        linkList.clear();
        linkList.display();
        linkList.insert(0,1);

JAVA数据结构——单链表的更多相关文章

  1. Java数据结构--单链表

    #java学习经验总结------单链表的建立与结点的增删 在该链表结点有data数据,并且还有cpu,分给cpu随机的时间片,根据时间片大小进行结点data的排序 链表结点的建立 class Lin ...

  2. java数据结构——单链表、双端链表、双向链表(Linked List)

    1.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...

  3. 数据结构——单链表java简易实现

    巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...

  4. JAVA数据结构之链表

    JAVA数据结构之链表 什么是链表呢? 链表作为最基本的数据结构之一,定义如下: 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 简单来说呢,链 ...

  5. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  6. java实现单链表的增删功能

    JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...

  7. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

  8. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

  9. 使用java实现单链表(转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html)

    使用java实现单链表----(java中的引用就是指针)转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html ? 1 2 3 4 5 6 7 ...

随机推荐

  1. Ctrl +c 脚本中

    #!/bin/bashsar -n DEV 1 111111111111111 >>1.txt &   #实时网卡流量数据  sleep 3 && kill -2 ...

  2. Java 二维数组,排序、切换顺序,查表法二进制十进制,这班查找、排序(冒泡、选择)、遍历,获取最大小值(4)

    Java 二维数组,排序.切换顺序,查表法二进制十进制,折半查找.排序(冒泡.选择).遍历,获取最大小值(4)

  3. 微信支付的Demo

    是在一个子项目完成的, 依赖: <dependencies> <!-- spring-boot--> <dependency> <groupId>org ...

  4. JAVA初学者——标识符命名规则及数据类型的转换

    Hello!我是浩宇大熊猫~ 直接进入正题吧~ 1)标识符的命名规则. 标识符命名法有小驼峰命名法和大驼峰命名法两种,分别应用于方法.变量和类. 小驼峰命名法应用于方法和变量,主要有两个约定: 1.标 ...

  5. 201312-2 ISBN号码 Java

    就是把-去掉,然后验证,只需要改最后一位. import java.util.Scanner; public class Main { public static void main(String[] ...

  6. java IO流的概念与分类

    DataInputStream && ObjectInputStream 示例 https://blog.csdn.net/hoho_12/article/details/520543 ...

  7. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第一天】

    本人做过一年的MATLAB编程和简单维护过VB和C++的项目.是跟着网上获得的黑马的Java双元视频课来自学入门Java知识和常用框架的使用. 淘淘商城(SpringMVC+Spring+Mybati ...

  8. 蓝屏(BSOD)转储设置,看本文就够了!

    原总结注册表debug调试dump转储文件蓝屏BSODprocess monitor 前言 我们在 内核转储,开抓啦! 这篇文章里介绍了一个关键的系统设置.设置好后可以让系统在蓝屏(Blue Scre ...

  9. python编程:从入门到实践----第五章>if 语句

    一.一个简单示例 假设有一个汽车列表,并想将其每辆汽车的名称打印出来.遇到汽车名‘bmw’,以全大写打印:其他汽车名,首字母大写 cars=['audi','bmw','subaru','toyota ...

  10. SaltStack中状态间关系unless、onlyif、require、require_in、watch、watch_in

    1.unless 检查的命令,仅当unless选项指向的命令返回值为false时才执行name定义的命令 cmd.run: {% "] %} - name: 'nohup sh /alida ...