首页 技术 正文
技术 2022年11月9日
0 收藏 375 点赞 3,027 浏览 5157 个字

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

[Java] 纯文本查看 复制代码?

010203040506070809101112131415161718192021222324252627282930313233343536 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] 纯文本查看 复制代码?

0102030405060708091011121314151617181920212223242526272829303132 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] 纯文本查看 复制代码?

001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113 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] 纯文本查看 复制代码 ?

0102030405060708091011121314151617181920212223242526272829303132 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);
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,497
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,910
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,744
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,498
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,135
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,298