数据结构:java实现链表,并用链表实现栈和队列

1.链表

1.概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。
在这里插入图片描述
头指针:
(1)标识链表,即链表的名字;
(2)存储链表中的第一个结点的地址。
尾指针:
尾指针即链表的最后一个结点,没有后继,因此指针域必须置空,即NULL。

2.java实现链表

public class LinkedArray<T> {
    //内部类
    private class Node<T>{
        T ele;
        Node next;
        public Node(T ele){
            this.ele = ele;
            this.next = null;
        }
        public Node(){
            this(null);
        }

        public Node(T ele,Node next){
            this.ele = null;
            this.next = null;
        }
        @Override
        public String toString(){
            return this.ele.toString();
        }
    }
    //链表长度
    private int size;
    //虚拟头结点
    private Node dummyHead;
    //获得链表长度
    public int getSize(){
        return size;
    }
    //判断链表是否为空
    public boolean isEmpty(){
        return size == 0;
    }

    public LinkedArray(){
        this.size = 0;
        this.dummyHead = new Node(null,null);
    }

    //向链表头部添加元素
    public void addHead(T ele) throws IllegalAccessException {
        //add(ele,0);
        Node node = new Node(ele);
        if(node == null){
            throw new IllegalAccessException("节点为空");
        }
        node.next = dummyHead.next;
        dummyHead.next = node;
        size++;
    }

    public void add(T ele,int index) throws IllegalAccessException{
        Node node = new Node(ele);
        if(node == null){
            throw new IllegalAccessException("结点为空");
        }
        if(index<0 || index>size){
            throw new IllegalAccessException("索引越界!");
        }
        Node prev = dummyHead;
        for(int i=0;i<index;i++){
            prev = prev.next;
        }
        //插入操作
        node.next = prev.next;
        prev.next = node;
        size++;
    }

    public void addTail(T ele) throws IllegalAccessException{
        //add(ele,size);
        Node node = new Node(ele);
        if(node == null){
            throw new IllegalAccessException("节点为空");
        }
        Node prev = dummyHead;
        for(int i=0;i<size;i++){
            prev = prev.next;
        }
        prev.next = node;
        size++;
    }

    //获取头节点元素
    public T getHead() throws IllegalAccessException{
        return get(0);
    }

    //获取最后一个元素
    public T getTail() throws IllegalAccessException{
        return get(size-1);
    }

    //获取任意位置上的元素
    public T get(int index) throws IllegalAccessException{
        if(index<0 || index>=size){
            throw new IllegalAccessException("索引错误!");
        }
        Node current = dummyHead.next;
        for(int i=0;i<index;i++){
            current = current.next;
        }
        return current == null?null:(T)current.ele;
    }

    //判断链表中是否含有指定元素
    public boolean contains(T ele){
        Node current = dummyHead.next;
        while (current != null){
            if(current.ele.equals(ele)){
                return true;
            }else {
                current = current.next;
            }
        }
        return false;
    }

    //更新节点
    public void set(int index,T ele) throws IllegalAccessException{
        if(index<0 || index>=size){
            throw new IllegalAccessException("索引越界!");
        }
        Node current = dummyHead.next;
        for(int i=0;i<index;i++){
            current = current.next;
        }
        current.ele = ele;
    }

    //删除指定位置元素
    public T remove(int index) throws IllegalAccessException{
        if(index<0 || index>=size){
            throw new IllegalAccessException("索引越界!");
        }
        Node prev = dummyHead;
        for(int i=0;i<index;i++){
            prev = prev.next;
        }
        Node delNode = prev.next;
        prev.next = delNode.next;
        delNode.next = null;
        T ele = (T)delNode.ele;
        size--;
        return ele;
    }

    @Override
    public String toString(){
        StringBuffer sb = new StringBuffer();
        Node current = dummyHead.next;
        while (current!=null){
            sb.append(current.ele+"--->");
            current = current.next;
        }
        sb.append("NULL");
        return sb.toString();
    }
}

3. 链表实现栈


public class LinkedStack<T> implements Stack<T> {
    private LinkedArray<T> data; //数据容器
    private int size;
    public LinkedStack(){
        data = new LinkedArray<>();
        size = 0;
    }

    @Override
    public T pop() throws IllegalAccessException {
        T ele = data.remove(0);
        size--;
        return ele;
    }

    @Override
    public void push(T ele) throws IllegalAccessException {
        data.addHead(ele);
        size++;
    }

    @Override
    public T peek() throws IllegalAccessException {
        return data.getHead();
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return data.isEmpty();
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("栈顶");
        sb.append("[");
        sb.append(data.toString());
        sb.append("]");
        return sb.toString();
    }
}

4.链表实现队列


public class LinkedQueue<T> implements Queue<T> {
    private LinkedArray<T> data;
    private int size;
    public LinkedQueue(){
        data = new LinkedArray<>();
        size = 0;
    }
    @Override
    public void enqueue(T ele) throws IllegalAccessException {
        data.addTail(ele);
        size++;
    }

    @Override
    public T dequeue() throws IllegalAccessException {
        T ele = data.remove(0);
        size--;
        return ele;
    }

    @Override
    public T getFront() throws IllegalAccessException {
        return data.getHead();
    }

    @Override
    public boolean isEmpty() {
        return data.isEmpty();
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("对首");
        sb.append("[");
        sb.append(data.toString());
        sb.append("]");
        sb.append("队尾");
        return sb.toString();
    }
}

5.测试


public class Test {
    public static void main(String[] args) throws IllegalAccessException {
        Test test = new Test();
        //test.linkedTest();
       //test.stackTest();
        test.queueTest();
    }

    public void linkedTest() throws IllegalAccessException {
        LinkedArray<Integer> linked = new LinkedArray<>();
        System.out.println(linked.isEmpty());//true
        for(int i=0;i<100;i++){
            if(i%10 == 0){
                linked.addTail(i);
            }
        }
        System.out.println(linked);//0--->10--->20--->30--->40--->50--->60--->70--->80--->90--->NULL
        System.out.println(linked.isEmpty());//false
        linked.remove(2);
        System.out.println(linked);//0--->10--->30--->40--->50--->60--->70--->80--->90--->NULL
        linked.set(4,12);
        System.out.println(linked);//0--->10--->30--->40--->12--->60--->70--->80--->90--->NULL
        linked.addHead(12);
        System.out.println(linked);//12--->0--->10--->30--->40--->12--->60--->70--->80--->90--->NULL
        linked.add(22,2);
        System.out.println(linked);//12--->0--->22--->10--->30--->40--->12--->60--->70--->80--->90--->NULL
    }

    public void stackTest() throws IllegalAccessException {
        LinkedStack<Integer> linkedStack = new LinkedStack<>();
        System.out.println(linkedStack.isEmpty());//true
        for(int i = 0;i<100;i++){
            if(i%10 == 0){
                linkedStack.push(i);
            }
        }//栈顶[90--->80--->70--->60--->50--->40--->30--->20--->10--->0--->NULL]
        linkedStack.pop();//栈顶[80--->70--->60--->50--->40--->30--->20--->10--->0--->NULL]
        System.out.println(linkedStack.peek());//80
        System.out.println(linkedStack.getSize());//9
        System.out.println(linkedStack);
    }

    public void queueTest() throws IllegalAccessException {
        LinkedQueue<Integer> linkedQueue = new LinkedQueue<>();
        System.out.println(linkedQueue.isEmpty());//true
        for(int i = 0;i<100;i++){
            if(i%10 == 0){
                linkedQueue.enqueue(i);
            }
        }//对首[0--->10--->20--->30--->40--->50--->60--->70--->80--->90--->NULL]队尾
        System.out.println(linkedQueue.dequeue());//0   对首[10--->20--->30--->40--->50--->60--->70--->80--->90--->NULL]队尾
        System.out.println(linkedQueue.getFront());//10
        System.out.println(linkedQueue.getSize());//9
        System.out.println(linkedQueue);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值