LeetCode19删除链表的倒数第N个节点20有效的括号
維護不易,還請點贊支持,微信搜索bigsai 回復進群一起打卡。
19刪除鏈表的倒數(shù)第N個節(jié)點
給定一個鏈表,刪除鏈表的倒數(shù)第 n 個節(jié)點,并且返回鏈表的頭結(jié)點。
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數(shù)第二個節(jié)點后,鏈表變?yōu)?1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現(xiàn)嗎?
分析:
可以掃描兩次,第一次獲取總長度,知道倒數(shù)第N是正數(shù)第幾個,第二次掃描真正的找到節(jié)點刪除。
如何掃描一次呢?
可以使用數(shù)組(集合),將所有節(jié)點地址存入ArrayList中,根據(jù)n找到正數(shù)的編號,直接編號前一個next指向編號后一個節(jié)點,最終返回頭即可,當然要考慮特殊情況比如刪除頭之類。實現(xiàn)代碼:
public ListNode removeNthFromEnd2(ListNode head, int n) { List<ListNode>list=new ArrayList<ListNode>();ListNode team=head;while (team!=null) {list.add(team);team=team.next;}list.add(null);if(list.size()==n)return head.next;if(list.size()<1)return null;int index=list.size()-1-n;list.get(index-1).next=list.get(index+1);return head; }還可以怎么考慮?
用兩個指針,一個先走N步,然后兩個同時向下尋找。一直到右側(cè)的到最盡頭即可找到待刪除節(jié)點。
這樣刪除并不方便,在具體操作上,要找到待刪除的前一個節(jié)點,用這個節(jié)點刪除他的后面節(jié)點。而如果待刪除的是頭節(jié)點可能還需要特殊討論,為了避免這種情況,我們可以使用一個頭節(jié)點放在最前側(cè),這樣就可以把鏈表中每一個節(jié)點都當作普通節(jié)點來處理。
具體代碼為:
public ListNode removeNthFromEnd(ListNode head, int n) { ListNode value=new ListNode(0);value.next=head;head=value;ListNode team=value;for(int i=0;i<n;i++){team=team.next;}while (team.next!=null) {team=team.next;head=head.next;}if(head.next!=null)head.next=head.next.next;return value.next; }20 有效的括號
給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認為是有效字符串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: "{[]}"
輸出: true
分析:
括號類的問題是經(jīng)典棧類問題,肯定要想到用棧處理。判斷一個字符串滿不滿足一個有效的字符串,就要看它是不是都能組成對。
- 從單個對來說,((,))都是不滿足的,只有()才可滿足,即一左一右。
- 從多個對來說{[(字符串還可接受任意無限(,[,{的括號。但是只能接收)的向左的括號。
從上面可以看作一種相消除的思想。例如(({[()()]}))字符串遍歷時候可以這樣處理:
- (({[(下一個)消掉成(({[
- (({[(下一個)消掉成(({[
- (({[下一個]消掉成(({
- (({下一個}消掉成((
- ((下一個)消掉成(
- (下一個)消掉成`` 這樣就滿足題意
所以這個過程利用棧判斷當前是加入棧還是消除頂部,到最后如果棧為空說明滿足,否則不滿足,當然具體括號要對應,具體實現(xiàn)代碼為:
public boolean isValid(String s) {Stack<Character>stack=new Stack<Character>();for(int i=0;i<s.length();i++){ char te=s.charAt(i);if(te==']'){if(!stack.isEmpty()&&stack.pop()=='[')continue;else {return false;}}else if(te=='}'){if(!stack.isEmpty()&&stack.pop()=='{')continue;else {return false;}}else if(te==')'){if(!stack.isEmpty()&&stack.pop()=='(')continue;else {return false;}}elsestack.push(te);}return stack.isEmpty(); }
用自帶的棧并不是很快,所以我們使用數(shù)組模擬棧的實現(xiàn),這樣速度就快了一點:
結(jié)語
原創(chuàng)不易,bigsai請你幫兩件事幫忙一下:
star支持一下, 您的肯定是我在平臺創(chuàng)作的源源動力。
微信搜索「bigsai」,關注我的公眾號,不僅免費送你電子書,我還會第一時間在公眾號分享知識技術。加我還可拉你進力扣打卡群一起打卡LeetCode。
記得關注、咱們下次再見!
總結(jié)
以上是生活随笔為你收集整理的LeetCode19删除链表的倒数第N个节点20有效的括号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 17电话号码的字母组合
- 下一篇: LeetCode 21合并两个有序链表2