LeetCode 刷题记录(19、20)—Java语言

19. 删除链表的倒数第N个节点

题目

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

思路

定义两个指针,第一个指针进行遍历,第二个指针为第一个指针的前n个节点。这样就能做到一次遍历即可删除指定的倒数第n个节点

代码

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head==null||head.next==null&&n==1)
            return null;
        ListNode node = head;
        ListNode delete = null;
        while(node!=null){
            if(n>0)n--;
            else if(delete==null)
                delete = head;
            else
                delete = delete.next;
            node = node.next;
        }
        if(delete!=null)
            delete.next = delete.next.next;
        else if(n==0)
            head = head.next;
        return head;
    }
}

20. 有效的括号

题目

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:

输入: “()”
输出: true
示例 2:

输入: “()[]{}”
输出: true
示例 3:

输入: “(]”
输出: false
示例 4:

输入: “([)]”
输出: false
示例 5:

输入: “{[]}”
输出: true

思路

首先这道题目的要求是配对的顺序和类型要是对的,即当前遍历到的右括号必须要与最近的左括号类型相同。并且需要左括号和右括号的每个类型的数量要一样,看到这个样的特性,可以想到用Stack的特性来解决这个问题,左边的括号就直接压入Stack中,右边的括号就要和Stack中的第一个就行匹配如果可以配对就出栈。同时还得注意数量也要相对应。最后如果Stack是空的即验证成功

代码

class Solution {
    public boolean isValid(String s) {
        Stack stack = new Stack<>();
        char in[] = s.toCharArray();
        for(char c : in){
            if(c=='(')
                stack.push(0);
            else if(c=='[')
                stack.push(1);
            else if(c=='{')
                stack.push(2);
            else if(stack.isEmpty())
                return false;
            else if(c==')'&&stack.pop()!=0)
                return false;
            else if(c==']'&&stack.pop()!=1)
                return false;
            else if(c=='}'&&stack.pop()!=2)
                return false;
        }
        return stack.isEmpty();
    }
}

你可能感兴趣的:(java,算法与数据结构,LeetCode)