1. 程式人生 > >LeetCode 刷題記錄(19、20)—Java語言

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<Integer> 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();
    }
}