【数据结构的魅力】002.单向、双向链表&栈和队列&递归

本文探讨了单链表和双链表的反转以及删除指定值节点的操作,同时介绍了如何利用数组实现固定大小的栈和队列,特别是设计了一个能返回栈中最小元素的高效栈。此外,还讲解了递归中的Master公式。内容涵盖了数据结构基础与算法实现技巧。
摘要由CSDN通过智能技术生成

单向、双向链表

单链表和双链表最简单的练习

1)单链表和双链表如何反转

2)删除给定值的全部节点

  1. 遍历链表,找到第一个不是给定值的元素,即为头结点
  2. while与if结合使用,通过两个变量(类似指针)来删除节点

栈和队列

经典题目

1)怎么用数组实现不超过固定大小的队列和栈

栈:正常使用数组

队列:使用环形数组

2)设计一个特殊的栈,在基本功能的基础上,再实现返回栈中最小元素的功能,且时间复杂度均为O(1)

思路:

  1. 准备两个栈:Data栈和Min栈
  2. 当加入数据时,Data栈正常加入,而Min栈除了第一个元素直接入栈以外,接下来每来一个元素都与Min栈栈顶比较,压入较小的元素(例如:如果外来元素为4,而栈顶为3,则将3入栈)
  3. 两个栈同时压入元素,同时弹出元素。用户使用push()、pop()方法返回Data栈的栈顶元素,使用getMin()(获得最小元素)的方法时,将Min栈栈顶元素返回即可

注意:两个栈一定要同时入同时出

package calss02;

import java.util.Stack;

public class GetStackMinEle {
    public static class MyStack{
        private Stack<Integer> stackData;
        private Stack<Integer> stackMin;

        public MyStack(){
            this.stackData = new Stack<Integer>();
            this.stackMin = new Stack<Integer>();
        }

        public int getMin(){
            if(this.stackMin.isEmpty()){
                throw new RuntimeException("你的栈是空的");
            }
            return this.stackMin.peek();
        }

        public void push(int newNum){
            if(this.stackMin.isEmpty()){
                this.stackMin.push(newNum);
            }else if(newNum<this.getMin()){
                this.stackMin.push(newNum);
            }else {
                int newMin = this.stackMin.peek();
                this.stackMin.push(newMin);
            }
            this.stackData.push(newNum);
        }

        public int pop(){
            if(this.stackData.isEmpty()){
                throw new RuntimeException("你的栈是空的");
            }
            this.stackMin.pop();
            return this.stackData.pop();
        }
    }

    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push(3);
        myStack.push(2);
        myStack.push(3);
        myStack.push(1);
        myStack.push(4);
        myStack.push(4);
        myStack.pop();
        int min = myStack.getMin();
        System.out.println(min);//1
    }
}

递归

Master公式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值