Java实现顺序表和链表的基本操作

java实现顺序表和单链表的基本操作

顺序表:
简单理解:一个有顺序的表[数组]。我们使用一个整数N来定义他的长度,一个数组来负责描述他的结构也就是

class SequenceList<T>{
	private T[] array;
	private Integer N;
	public SequenceList(Integer capacity){
		this.array = (T[])new Object[capacity];
		this.N = 0;
	}
}

关于顺序表的一些基本处理:

package wh1006.datastructure.train;

import java.util.Iterator;

public class SequenceList<T> implements Iterable{
    private T[] eles;
    private int N;
    public SequenceList(int capacity){
        this.eles = (T[]) new Object[capacity];
        this.N = 0;
    }
    //初始化顺序表
    public void clear(){
        this.N =0;
    }
    //判断线性表是否为空
    public boolean isEmpty(){
        return N==0;
    }
    //返回线性表的长度
    public int length(){
        return N;
    }
    //返回第i个位置的元素
    public T get(int i){
        return eles[i];
    }
    //数组扩容
    public void resize(int newSize){
        T[] temp = eles;
        eles = (T[]) new Object[newSize];
        for (int i = 0; i < eles.length; i++) {
            eles[i] = temp[i];
        }
    }
    //插入元素
    public void insert(T t){
        //判断线性表满不满
        if(N==eles.length){
            resize(N*2);
        }
        eles[N] = t;
        N++;
    }
    //插入元素到指定位置
    public void insert(int i,T t){
        if(N==eles.length){
            resize(N*2);
        }
        N++;
        for (int j = N-1; j >= i ; j--) {
            eles[j+1] = eles[j];
        }
    }
    //删除元素(根据下标删除)
    public T remove(int i){
        T t = eles[i];
        for (int j = i; j <eles.length-1; j++) {
            eles[j] = eles[j+1];
        }
        N--;
        return t;
    }

    //删除第一次出现元素(根据元素删除)
    public void remove(T t){
        int j = 0;
        for (int i = 0; i < eles.length; i++) {
            if(eles[i] == t){
                 j = i;
            }
        }
        for (int z = j;z<eles.length-1;z++){
            eles[z] = eles[z+1];
        }
        N--;
    }
    //遍历
    @Override
    public Iterator iterator() {
        return new SItrator();
    }
    private class SItrator implements Iterator{
        private int cursor = 0;
        @Override
        public boolean hasNext() {
            return N==cursor;
        }

        @Override
        public Object next() {
            return eles[cursor++];
        }
    }
}

顺序表的主要不足:占用空间较大(尤其是扩容时空间复杂度为2N)

链表:
基本理解:类似于有人给你指路的过程,只会告诉你路在哪里【告诉你下一个节点的位置】,而不会告诉你路的终点有什么。并且只有知道上一个节点在哪才能知道下一个节点在哪儿

链表的基本结构为节点,抽象为类:

class Node<T>{
	private T item;
	private Node next;
	public Node(T item,Node next){
		this.item = item;
		this.next = next;
	}
}

链表的基本结构:

class LinkList{
	private Node head; //头结点
	private Integer N; //链表的长度
	public LinkList(){
		this.head = new Node(null,null);
		this.N = 0;
	}
}

链表的基本操作

package wh1006.datastructure.train;

public class LinkList<T> {
    private Node head;
    private int N;
    private class Node{
        T item;
        Node next;
        public Node(T item,Node next){
            this.item = item;
            this.next = next;
        }
    }

    //初始化链表
    public LinkList(){
        this.head = new Node(null,null);
        this.N =0;
    }
    //判断链表是否为空
    public Boolean isEmpty(){
        return N==0;
    }
    //返回链表的长度
    public int length(){
        return N;
    }
    //清空链表
    public void clear(){
        head.next=null;
        this.N=0;
    }
    //获取指定位置的元素
    public T get(int i){
        Node node = head.next;
        for(int index=0;index<i;index++){
            node = node.next;
        }
        return node.item;
    }
    //插入元素
    public void insert(T t){
        Node node = head;
        while (node.next!=null){
            node = node.next;
        }
        Node newNode = new Node(t,null);
        node.next = newNode;
        N++;
    }

    //插入元素到指定位置
    public void insert(T t,int i){
        Node node = head;
        for(int index = 0;index<i-1;index++){
            node = node.next;
        }
        Node NextNode = node.next;
        Node NewNode = new Node(t,NextNode);
        node.next = NewNode;
        N++;
    }
    //删除元素
    public T remove(int i){
        Node node = head;
        for(int index = 0;index<i-1;index++){
            node = node.next;
        }
        T item = node.next.item;
        node.next = node.next.next;
        N--;
        return item;
    }
    //返回第一个元素
    public int indexof(T t){
        Node node = head;
        for (int index=0;index<N;index++){
            if (node.item!=t){
                node = node.next;
            }else{
                return index;
            }
        }
        return -1;
    }
}

链表的缺点:不便于查找,查找消耗的时间太多,起码为查找的位置i;
测试顺序表:

package wh1006.datastructure.test;

import wh1006.datastructure.SequenceList;

public class SequenceListTest {
    public static void main(String[] args) {
        SequenceList<String> sl = new SequenceList<>(10);
        //测试插入
        sl.insert("姚明");
        sl.insert("科比");
        sl.insert("库里");
        sl.insert(1,"詹姆斯");
        sl.insert("姚明");
        sl.insert("科比");
        sl.insert("库里");
        sl.insert("詹姆斯");
        sl.insert("姚明");
        sl.insert("科比");
        sl.insert("字母歌");
        //测试获取
        for (String s:sl
             ) {
            System.out.println(s);
        }
//        sl.printSe();
//        String s = sl.get(1);
//        System.out.println(s);
//        String remove = sl.remove(0);
//        System.out.println("被删除的元素是:"+remove);
//        sl.clear();
//        System.out.println("清空后线性表中的元素个数为:"+sl.length());
    }
}

链表的测试:

package wh1006.datastructure.test;

import wh1006.datastructure.SequenceList;
import wh1006.datastructure.train.LinkList;

public class LinkListTest {
    public static void main(String[] args) {
        LinkList<String> sl = new LinkList<>();
        //测试插入
        sl.insert("姚明");
        sl.insert("科比");
        sl.insert("库里");
        sl.insert("詹姆斯",2);
        sl.remove(4);
        for (int i = 0; i < sl.length(); i++) {
            System.out.print(sl.get(i)+" ");
        }
    }

}
顺序表链表是两种基本的数据结构,它们在Java中可以分别通过数组和链式节点来实现顺序表通常使用数组来实现,因为它提供了连续的内存空间,可以通过下标直接访问元素,实现O(1)时间复杂度的查找操作。顺序表的插入和删除操作时间复杂度为O(n),因为这可能涉及到移动大量元素来填补因删除元素或插入新元素而在数组中产生的空位或额外空间。 链表使用一系列的节点来存储数据,每个节点都包含数据以及指向下一个节点的引用(在双向链表中,还有指向前一个节点的引用)。链表的插入和删除操作通常只需要改变相应的指针,因此在理想情况下时间复杂度为O(1),而查找操作需要从头节点开始,遍历链表,直到找到目标节点,所以时间复杂度为O(n)。 以下是使用Java实现顺序表链表的简单示例: 顺序表(数组实现): ```java public class ArrayList<T> { private T[] data; private int size; public ArrayList(int capacity) { data = (T[]) new Object[capacity]; size = 0; } public void add(T element) { if (size >= data.length) { resize(); } data[size++] = element; } // 其他方法,如get(index), remove(index)等 private void resize() { // 实现扩容逻辑 } } ``` 链表(单向链表实现): ```java public class LinkedList<T> { private Node<T> head; private Node<T> tail; private int size; private static class Node<T> { T data; Node<T> next; public Node(T data, Node<T> next) { this.data = data; this.next = next; } } public LinkedList() { head = null; tail = null; size = 0; } public void add(T element) { Node<T> newNode = new Node<>(element, null); if (head == null) { head = newNode; tail = newNode; } else { tail.next = newNode; tail = newNode; } size++; } // 其他方法,如get(index), remove(index)等 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

图论难的离谱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值