Java实现链表,队列,稀疏数组

1.稀疏数组

为了节约空间,引入了稀疏数组!

在一些二维数组中,如果有很多的无效数据,那么转化为稀疏数组无疑是一个好的选择!

package SparseArray;
//稀疏数组
public class SparseArrayDemo {
    //二维数组转稀疏数组
    public static void main(String[] args) {
        int sum = 0;
        int[][] arr = new int[10][10];
        arr[0][1] = 3;
        arr[3][8] = 7;

        for (int x[]:arr){
            for (int y:x){
                sum++;
                System.out.printf("%d\t",y);
                if (sum % 10 == 0){
                    System.out.println();
                }
            }
        }
        int number = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length ; j++) {
                if (arr[i][j] != 0 ){
                    number++;
                }
            }
        }
        //将二维数组转化为稀疏数组
        int sparseArray[][] = new int[number+1][3];
        sparseArray[0][0] = number;
        sparseArray[0][1] = 11;
        sparseArray[0][2] = 11;
        int s = 1;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length ; j++) {
                if (arr[i][j] != 0 ){
                    sparseArray[s][0] = arr[i][j];
                    sparseArray[s][1] = i;
                    sparseArray[s][2] = j;
                    s++;
                }
            }
        }
        System.out.println();
        int num = 0;
        for (int x[]:sparseArray){
            for (int y:x){
                num++;
                System.out.printf("%d\t",y);
                if (num % 3 == 0){
                    System.out.println();
                }
            }
        }
        //将稀疏数组转化为二维数组
        int newArray[][] = new int[sparseArray[0][1]][sparseArray[0][2]];
        for (int i = 1; i < sparseArray.length; i++) {
            for (int j = 0; j < 3 ; j++) {
                newArray[sparseArray[i][1]][sparseArray[i][2]] = sparseArray[i][0];
            }
        }
        int m = 0;
        System.out.println();
        for (int x[]:newArray){
            for (int y:x){
                m++;
                System.out.printf("%d\t",y);
                if (m % newArray[0].length == 0){
                    System.out.println();
                }
            }
        }
    }

}

2.队列

队列遵循的标准是先进先出,后进后出!

第一种是直接使用数组,但是这种方法有弊端,即只能使用一次,不能循环使用

package Queue;

/**
 *    队列:有序列表
 *    遵循先入先出:即先存的先取出,后存的后取出
 *    但是现阶段的数组存在问题,只能用一次就不能再用了
 */
public class queue {
    public static void main(String[] args) {
      queues queues = new queues(5);
      queues.addqueue(3);
      queues.addqueue(4);
      queues.addqueue(2);
      queues.addqueue(11);
      queues.showFirstQueue();
    }
}
//数组模似队列
class queues{
    public int Maxsize;            //队列的最大容量
    public int front = -1;         //指向队列最前列的前一个位置
    public int reas = -1;          //指向队列最后一个位置
    public int arr[];

    public queues(int maxsize){
        Maxsize = maxsize;
        arr = new int[Maxsize];
    }

    public boolean IsEmpty(){      //判断是否为空
        return reas == front;
    }
    public boolean IsFull(){      //判断是否已满
        return reas == Maxsize - 1;
    }
    public void addqueue(int number){     //添加数据
        if (IsFull()){
            System.out.println("队列已经满了,不能添加");
            return;
        }
        reas++;
        arr[reas] = number;
    }
    public void getQueue(){               //取出数据,并且把前指针向后移一个单位
        if (IsEmpty()){
            System.out.println("队列为空,无数据");
            return;
        }
        front++;
        System.out.println(arr[front]);
    }
    public void showQueue(){              //展示所有数据
        if (IsEmpty()){
            System.out.println("队列为空,无数据");
            return;
        }
        for (int x = 0 ; x <= reas;x++) {
            System.out.println(arr[x]);
        }
    }
    public void showFirstQueue(){
        if (IsEmpty()){
            System.out.println("队列为空,无数据");
            return;
        }
        System.out.println(arr[front + 1]);
    }
}

第二种就是使用环形数组,但是这种方法会牺牲一个空间,具体的看代码

package Queue;

import java.util.Scanner;

public class RingQueue {
    public static void main(String[] args) {
        RingQueues ringQueues = new RingQueues(3);
        boolean loop =true;
        //菜单
        while (loop){
            System.out.println("a(add)");
            System.out.println("g(get)");
            System.out.println("s(show)");
            System.out.println("f(first)");
            System.out.println("e(exit)");
            Scanner s = new Scanner(System.in);
            char ls = s.next().charAt(0);
            switch (ls){
                case 'a':
                    System.out.println("请输入插入的数:");
                     int sum =s.nextInt();
                     ringQueues.addqueue(sum);
                     break;
                case 'g':
                     ringQueues.getQueue();
                     break;
                case 's':
                    ringQueues.showQueue();
                    break;
                case 'f':
                    ringQueues.showFirstQueue();
                    break;
                case 'e':
                    loop = false;
                    break;
            }
        }
    }
}
class RingQueues{
    public int Maxsize;            //队列的最大容量
    public int front = 0;         //指向队列最前列的位置
    public int reas = 0;          //指向队列最后一个位置的后一个位置
    public int arr[];

    public RingQueues(int maxsize){
        Maxsize = maxsize;
        arr = new int[Maxsize];
    }
    public boolean IsEmpty(){      //判断是否为空
        return reas == front;
    }
    public boolean IsFull(){      //判断是否已满
        return (reas+ 1) % Maxsize == front;
    }
    public void addqueue(int number){     //添加数据
        if (IsFull()){
            System.out.println("队列已经满了,不能添加");
            return;
        }
        arr[reas] = number;
        reas = (reas + 1) % Maxsize;
    }
    public void getQueue(){               //取出数据,并且把前指针向后移一个单位
        if (IsEmpty()){
            System.out.println("队列为空,无数据");
            return;
        }
        System.out.println(arr[front]);
        front = (front + 1) % Maxsize;
    }
    public void showQueue(){              //展示所有数据
        if (IsEmpty()){
            System.out.println("队列为空,无数据");
            return;
        }
        for (int x = front ; x <= (reas +Maxsize -front) % Maxsize;x++) {
            System.out.println(arr[x]);
        }
    }
    public void showFirstQueue(){
        if (IsEmpty()){
            System.out.println("队列为空,无数据");
            return;
        }
        System.out.println(arr[front]);
    }
}

3.单向链表

Java实现链表,队列,稀疏数组
在这里插入图片描述

package List;

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        SingleLinkedList list = new SingleLinkedList();
        list.AddByOrder(new HeroList(1,"李坤","黑旋风"));
        list.AddByOrder(new HeroList(4,"鲁智深","花和尚"));
        list.AddByOrder(new HeroList(2,"吴用","及时雨"));
        list.AddByOrder(new HeroList(3,"毛概","朱芊"));
        list.ShowList();
        list.Updata(new HeroList(3,"龚雷","大朋友"));
        list.ShowList();
        list.Delete(new HeroList(1,"",""));
        list.ShowList();
    }
}
class SingleLinkedList{
    public HeroList head = new HeroList(0,"","");
    //该方法是直接添加到末尾,不是按照序号
    public void AddList(HeroList heroList){
        HeroList demo = head;
        while (true){
            if (demo.next == null){
              demo.next = heroList;
              break;
            }
            demo = demo.next;
        }
    }
    public void Delete(HeroList heroList){
       if (head.next == null){
           System.out.println("链表为空!");
           return;
       }
       boolean flag = false;
       HeroList demo = head;
       while (true){
           if (demo.next == null){
               return;
           }
           else if (heroList.no == demo.next.no){
               flag = true;
               break;
           }
           demo = demo.next;
       }
       if (flag){
          demo.next = demo.next.next;
       }
       else {
           System.out.println("排名未查到");
       }
    }
    public void Updata(HeroList newHerolist){
        if (head.next == null){
            System.out.println("链表为空,不能更新");
            return;
        }
        HeroList demo = head;
        boolean flag = false;
        while (true){
            if (demo.next == null){
                break;
            }
            else if (demo.no == newHerolist.no){
                flag = true;
                break;
            }
            demo = demo.next;
        }
        if (flag){
            demo.name = newHerolist.name;
            demo.Nickname = newHerolist.Nickname;
        }
        else {
            System.out.println("输入的排名未查到!");
        }

    }
    //根据序号来添加
    public void AddByOrder(HeroList heroList){
        HeroList demo = head;
        boolean flag = false;
        while (true){
            if (demo.next == null){
                break;
            }
            else if (demo.next.no == heroList.no){
                flag = true;
                break;
            }
            else if (demo.next.no > heroList.no){
                break;
            }
            demo = demo.next;
        }
        if (flag){
            System.out.println("英雄的排名已经存在,不能加入!");
        }
        else {
            heroList.next = demo.next;
            demo.next = heroList;
        }
    }
    public void ShowList(){

        if (head.next == null){
            System.out.println("链表为空,没有数据");
            return;
        }
        HeroList demo1 = head.next;
        while (true){
            if (demo1 == null){
                break;
            }
            System.out.println(demo1);
            demo1 = demo1.next;
        }
    }
}
class HeroList{
    public int no;
    public String name;
    public  String Nickname;
    public HeroList next;

    public HeroList(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        Nickname = nickname;
    }

    @Override
    public String toString() {
        return "HeroList{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", Nickname='" + Nickname + '\'' ;
    }
}

4.双向链表

双向链表和单向链表唯一的差别就是双向链表有两个指针,一个指向前面,一个指向后面,其他和单向链表无巨大差异

package List;

public class DoubleLinkedListDemo {
    public static void main(String[] args) {
        DoubleLinkedList demo1 = new DoubleLinkedList();
        demo1.AddByOrder(new HeroList1(7,"龚雷","小猪"));
        demo1.AddByOrder(new HeroList1(6,"朱芊","小猪"));
        demo1.AddByOrder(new HeroList1(5,"熊国成","小熊"));
        demo1.AddByOrder(new HeroList1(4,"熊国成","小熊"));
        demo1.AddByOrder(new HeroList1(8,"熊国成","小熊"));
        demo1.ShowList();
    }
}
class DoubleLinkedList{
    public HeroList1 head = new HeroList1(0,"","");

    /**
     * 展示双向链表数据
     */
    public void ShowList(){
        if (head.next == null){
            System.out.println("链表为空,没有数据");
            return;
        }
        HeroList1 demo1 = head.next;
        while (true){
            if (demo1 == null){
                break;
            }
            System.out.println(demo1);
            demo1 = demo1.next;
        }
    }

    /**
     * 直接添加到双向链表末尾
     * @param heroList
     */
    public void AddList(HeroList1 heroList){
        HeroList1 demo = head;
        while (true){
            if (demo.next == null){
                demo.next = heroList;
                break;
            }
            demo = demo.next;
        }
            heroList.pre = demo;
            demo.next = heroList;

    }

    /**
     * 依照序号添加
     * @param heroList
     */
    public void AddByOrder(HeroList1 heroList){
        HeroList1 demo = head;
        boolean flag = false;
        while (true){
            if (demo.next == null){
                break;
            }
            else if (demo.next.no == heroList.no){
                flag = true;
                break;
            }
            else if (demo.next.no > heroList.no){
                break;
            }
            demo = demo.next;
        }
        if (flag){
            System.out.println("英雄的排名已经存在,不能加入!");
        }
        else {
            if (demo == head && head.next == null){
                head.next = heroList;
                heroList.pre = head;
                heroList.next = null;
                return;
            }
            if (demo == head && head.next != null){
                heroList.next = demo.next;
                demo.next.pre = heroList;
                head.next = heroList;
                heroList.pre = head;
                return;
            }
             else if (demo.next == null && head.next != null){
                demo.next = heroList;
                heroList.pre = demo;
                heroList.next = null;
                return;
            }
             demo.next = heroList;
             heroList.pre = demo;
             heroList.next = demo.next;
             demo.next.pre = heroList;
        }
    }

    /**
     * 修改双向链表的值
     * @param newHerolist
     */
    public void Updata(HeroList1 newHerolist){
        if (head.next == null){
            System.out.println("链表为空,不能更新");
            return;
        }
        HeroList1 demo = head;
        boolean flag = false;
        while (true){
            if (demo.next == null){
                break;
            }
            else if (demo.no == newHerolist.no){
                flag = true;
                break;
            }
            demo = demo.next;
        }
        if (flag){
            demo.name = newHerolist.name;
            demo.Nickname = newHerolist.Nickname;
        }
        else {
            System.out.println("输入的排名未查到!");
        }

    }

    /**
     * 删除节点
     * @param heroList
     */
    public void Delete(HeroList1 heroList){
        if (head.next == null){
            System.out.println("链表为空!");
            return;
        }
        boolean flag = false;
        HeroList1 demo = head.next;
        while (true){
            if (demo == null){
                return;
            }
            else if (heroList.no == demo.no){
                flag = true;
                break;
            }
            demo = demo.next;
        }
        if (flag) {
            demo.pre.next = demo.next;
            if (demo.next != null) {    //如果demo为最后一个,会有空指针异常
                demo.next.pre = demo.pre;
            }
        }
        else {
            System.out.println("排名未查到");
        }
    }
}
class HeroList1{
    public int no;
    public String name;
    public  String Nickname;
    public HeroList1 next;
    public HeroList1 pre;

    public HeroList1() {
    }

    public HeroList1(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        Nickname = nickname;
    }

    @Override
    public String toString() {
        return "HeroList1{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", Nickname='" + Nickname + '\'' ;
    }
}

以上知识是自学尚硅谷java数据结构,同时给尚硅谷一个好评!同志们,一起加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小猪~~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值