LeetCode 刷題記錄(19、20)—Java語言
阿新 • • 發佈:2019-02-14
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();
}
}