【面试题】链表、栈和队列

本文介绍了数据结构中的顺序存储结构、链式存储结构,包括单链表、双向链表和循环链表的操作,以及栈和队列的基本概念和应用。重点探讨了链表的插入、删除、逆置和环判断,同时讲解了栈的后进先出特性以及队列的先进先出原则。
摘要由CSDN通过智能技术生成
1.顺序存储结构
  • 顺序存储结构,即数组。优点:节省存储空间,随机存取表中元素;缺点 :插入和删除操作需要移动元素

  • 顺序存储结构的插入与删除操作代码实现

    /**
     * 顺序链表的插入
     * @param data
     */
    public void insert(int data){
   
        if (length >= size){
   
            return;
        }

        if (0 == length){
   
            datas[length++] = data;
            return;
        }

        int location = length;

        for (int i=0;i<length;i++){
   
            if (datas[i] > data){
   
                location = i;
                break;
            }
        }

        for (int i=length-1;i>=location;i--){
   
            datas[i+1] = datas[i];
        }

        datas[location] = data;
        length++;
    }

    /**
     * 顺序链表的删除
     * @param data
     */
    public void remove(int data){
   
        if (0 == length){
   
            return;
        }
        int location = -1;
        for(int i=0;i<length;i++){
   
            if (datas[i] == data){
   
                location = i;
                break;
            }
        }
        if (location == -1){
   
            return;
        }
        for (int i=location;i<length-1;i++){
   
            datas[i] = datas[i+1];
        }
        length--;
    }

2.链式存储结构
  • 链式存储结构:用一组任意的存储单元存储线性表的数据元素,分为单链表、双链表、循环链表。逻辑上相邻的节点物理上不必相邻,每个结点是由数据域和指针域组成。

  • 链式存储结构的优点: 插入、删除开销小(不必移动节点,只要改变节点中的指针)。缺点 :查找结点时链式存储要比顺序存储慢。

2.1 单链表的插入删除、链表逆置、判断有环
    /**
     * 1.插入节点
     * @param data 插入值
     */
    public void insert (int data){
   
        Node node = new Node(data);
        if (null == this.head){
   
            this.head = node;
            return;
        }

        Node tmp = head;
        while(tmp.next != null){
   
            tmp = tmp.next;
        }
        // 添加新的节点到链表末尾
        tmp.next = node;
    }

    /**
     * 2.删除节点
     * @param data 删除节点的值
     */
    public void remove(int data){
   
        if (null == this.head ){
   
            return;
        }

        if (this.head.getData() == data){
   
            this.head = this.head.getNext();
            return;
        }

        Node p = this.head;
        while(null != p.getNext()){
   
            if (p.getNext().getData() == data){
   
                break;
            }
            p = p.getNext();
        }

        if (null != p.getNext()){
   
            p.setNext(p.getNext().getNext());
            print();
        }
    }
    
    /**
     * 输出链表元素
     */
    public void print(){
   
        Node p = this.head;
        while(null != p){
   
            System.out.print(p.getData()+"->");
            p = p.getNext();
        }
    }

    /**
     * 3.链表逆序
     */
    public void reverseLinkList() {
   
        if (head == null || head.getNext() == null) {
   
            return<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值