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