Leetcode 第232,234,235,242,257,268,278,283,303,326题(Java解法)

第232题 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:
你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例 1:

输入 输出
[“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”] [[], [1], [2], [], [], []] [null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

解题思路

这道题的难点在于用栈实现队列的先进先出操作,这里定义了双栈,入队时,每次输入元素进入入栈,出队和返回第一个元素时,先判断出栈中是否有元素,如果没有,则依次将入栈中的元素弹出然后弹入到出栈中,再对出栈执行弹出操作

代码

// 用栈实现队列:双栈
class MyQueue {
   
    Deque<Integer> inStack;//定义入栈
    Deque<Integer> outStack;//定义出栈
    public MyQueue() {
   
        inStack = new LinkedList<Integer>();//设为链表
        outStack = new LinkedList<Integer>();//设为链表
    }    
    public void push(int x) {
   //入队
        inStack.push(x);//将元素加入入栈中
    }
    public int pop() {
   //出队
        if (outStack.isEmpty()) {
   
            in2out();//如果栈为空,则执行in2out
        }
        return outStack.pop();//栈不为空,则出栈弹出元素
    }    
    public int peek() {
   //返回第一个元素
        if (outStack.isEmpty()) {
   
            in2out();//判断出栈是否为空,为空则执行in2out
        }
        return outStack.peek();//不为空则返回出栈的栈顶元素
    }
    public boolean empty() {
   //判断是否为空队列
        return inStack.isEmpty() && outStack.isEmpty();
    }//当入栈和出栈都为空时,则判定位空队
    private void in2out() {
   
        while (!inStack.isEmpty()) {
   
            outStack.push(inStack.pop());
        }//最精彩的操作,当入栈不为空时,出栈弹入入栈弹出的元素
    }
}

时间复杂度为O(1),push、empty为O(1),pop和peek平均为O(1),对于每个元素,最多执行入栈和出栈各两次,时间复杂度也为O(1)
空间复杂度为O(n),因为队列存储元素为n

第234题 回文链表

请判断一个链表是否为回文链表。

示例 1:

输入 输出
1->2 false

示例 2:

输入 输出
1->2->2->1 true

解题思路

本题使用快慢双指针来查找链表的中间节点,核心思想是反转链表的后半部分,然后让链表的前半部分和反转过的后半部分进行比值来判断链表是否回文。

代码

// 回文链表:双指针
class Solution {
   
    public boolean isPalindrome(ListNode head) {
   
        if (head == null) {
   
            return true;
        }//如果头指针为空,则返回是回文链表
        // 找到前半部分链表的尾节点并反转后半部分链表
        ListNode firstHalfEnd = endOfFirstHalf(head);//找到前半部分链表的尾节点
        ListNode secondHalfStart =</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值