删除链表中的结点(链表)、比较含退格的字符串(栈)、棒球比赛(栈)

237 删除链表中的结点(链表)

分析:一般链表删除一个结点是把这个结点的上一个结点指向这个结点的下一个j结点,但是现在只有被删除的结点,单向链表中我们并不能得到他的上一个结点,只能得到他的下一个结点,因此我们换一种思路,把它下一节点的数据赋给这个结点,然后把它指向他的下下个结点,删除下一个结点,这样就实现删除这个结点。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public void deleteNode(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }
}

844 比较含退格的字符串(栈)

给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。

分析:从给的例子中可以看出,他们都是把输入的字符串经过#退格完成后然后进行比较的,这样的话我们就可以先把两个输入都进行退格操作,然后我们直接比较新的字符串是否相等就可以了。现在我们来理解它的退格的含义,退格就是把上一个字母去除,如果上一个没有做字母,则不进行操作。我们用栈来解决的话,就可以把他们挨个检查,如果是字母则入栈,如果是#则出栈一次(根据栈的实现代码可知,如果为空栈时不能进行退栈操作,因此在#时我们还要区分它到底是不是空栈)

class Solution {
    public boolean backspaceCompare(String S, String T) {
        Stack<Character> stack1 = backsapceStack(S);
        Stack<Character> stack2 = backsapceStack(T);
        return stack1.equals(stack2);
    }
    public Stack<Character> backsapceStack(String s) {//把字符串进行含退格处理
        Stack<Character> stack = new Stack<Character>();
        for(int i=0; i<s.length(); i++) {
            if(s.charAt(i)=='#'){//为#号时分两种情况。(字符串String函数charAt(i);取出位置在i出的字符)
                if(!stack.isEmpty()){//只有空栈才执行出栈
                    stack.pop();
                }
            }else{
                stack.push(s.charAt(i));
            }
        }
        return stack;
    }
}

682 棒球比赛(栈)

实例:    输入: ["5","-2","4","C","D","9","+","+"]

    输出: 27

分析:第一次 5;二次 -2;第三次 4;第四次 C,C表示上一个获得分数无效,表示第三次获得4无效,于是经过这一轮,只剩第一第二次的{5,-2};第五次D,D表示本轮获得得分是前一轮的两倍,现在有效的前一轮为-2,于是本轮得分为-4,现在得分为{5,-2,-4};第六次事9,{5,-2,-4,9};第七次是 +,前两轮之和为5,{5,-2,-4,9,5},第八次 是 +,前两个之和为9+5=14,{5,-2,-4,9,5,14}。因此总和为:5-2-4+9+5+14=27;

因此就可以总结为:遇到数字则入栈,遇到C出栈,遇到D把栈顶数据乘2后入栈,遇到+,把栈顶和栈顶下一结点的数据加和再入栈,最后所有栈内所有数据加和。

class Solution {
    public int calPoints(String[] ops) {
        Stack<Integer> stack = new Stack();
        
        for(String op : ops){
            if(op.equals("+")){
         //获得栈顶数字和栈顶下一个结点数字之和的方法。先获得栈顶元素,然后出栈,新的新的栈顶元素(原来栈顶的下一节点元素),
         //然后恢复原来的栈顶(入栈原来的栈顶元素),然后把两数之和也入栈
int top = stack.pop(); int newtop = top + stack.peek();//stack.peek()是获得栈顶数据的方法,不会使栈顶元素出栈。 stack.push(top); stack.push(newtop); }else if(op.equals("C")){ stack.pop(); }else if(op.equals("D")){ stack.push(2*stack.peek()); }else{ stack.push(Integer.valueOf(op));//获得的字符是数字则要把它转化为整型。 } } int ans = 0; for(int s : stack) ans+=s; return ans; } }
原文地址:https://www.cnblogs.com/dong973711/p/10692271.html