摘要:給定一個(gè)鏈表,刪除鏈表的倒數(shù)第個(gè)節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。示例給定一個(gè)鏈表和當(dāng)刪除了倒數(shù)第二個(gè)節(jié)點(diǎn)后,鏈表變?yōu)檎f明給定的保證是有效的。值得注意的的是,指向應(yīng)當(dāng)刪除的節(jié)點(diǎn)并無法刪除它,應(yīng)當(dāng)指向該刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。
給定一個(gè)鏈表,刪除鏈表的倒數(shù)第 n 個(gè)節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。
Given a linked list, remove the n-th node from the end of list and return its head.
示例:
給定一個(gè)鏈表: 1->2->3->4->5, 和 n = 2. 當(dāng)刪除了倒數(shù)第二個(gè)節(jié)點(diǎn)后,鏈表變?yōu)?1->2->3->5.
說明:
給定的 n 保證是有效的。
Note:
Given n will always be valid.
進(jìn)階:
你能嘗試使用一趟掃描實(shí)現(xiàn)嗎?
Follow up:
Could you do this in one pass?
解題思路:這道題很有意思,雖然很簡單,但是很考驗(yàn)一個(gè)人的思維。最先想到的方法就是遍歷整個(gè)鏈表得到長度,減去 n 得到實(shí)際應(yīng)該刪除的節(jié)點(diǎn)的位置了。然而由于單鏈表刪除操作的特殊性,得到位置之后仍然需要再遍歷一次來刪除該節(jié)點(diǎn)。
進(jìn)階要求是一次遍歷完成該題,想想是否有好的方法?
假設(shè)鏈表長度為 L ,定義一個(gè)指針先走 n 步,此時(shí)該指針還剩下 L-n 個(gè)節(jié)點(diǎn)即可完成該鏈表的遍歷。而第 L-n 個(gè)節(jié)點(diǎn)不就是題目要求的的要?jiǎng)h除的倒數(shù)第 n 個(gè)節(jié)點(diǎn)嗎?這時(shí)候只需要再定義一個(gè)指針,讓它與之前的指針同時(shí)遍歷,當(dāng)?shù)谝粋€(gè)指針遇到空節(jié)點(diǎn)時(shí)(null 節(jié)點(diǎn)),該指針即指向刪除的節(jié)點(diǎn)。
值得注意的的是,指向應(yīng)當(dāng)刪除的節(jié)點(diǎn)并無法刪除它,應(yīng)當(dāng)指向該刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。
Java:class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode curA = head; ListNode curB = head; for (int i = 0; i < n; i++) curA = curA.next; if (curA == null) {//如果走了n步之后該節(jié)點(diǎn)指向空節(jié)點(diǎn),則該鏈表只有一個(gè)節(jié)點(diǎn) head = head.next; return head; } while (curA.next != null) {//當(dāng)?shù)谝粋€(gè)指針的下一個(gè)節(jié)點(diǎn)為空時(shí),該指針指向最后一個(gè)節(jié)點(diǎn),而指針curB 走了L-n-1步,即指向該刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn) curA = curA.next; curB = curB.next; } curB.next = curB.next.next;//將本來指向應(yīng)當(dāng)刪除節(jié)點(diǎn)地址指向應(yīng)當(dāng)刪除節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)的地址 return head; } }Python3:
class Solution: def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode: curA,curB=head,head for i in range(n): curA=curA.next if not curA: head=head.next return head while(curA.next): curA=curA.next curB=curB.next curB.next=curB.next.next
歡迎關(guān)注公.眾號(hào)一起刷題:愛寫B(tài)ug
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/45232.html
摘要:給定一個(gè)鏈表,刪除鏈表的倒數(shù)第個(gè)節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。示例給定一個(gè)鏈表和當(dāng)刪除了倒數(shù)第二個(gè)節(jié)點(diǎn)后,鏈表變?yōu)檎f明給定的保證是有效的。值得注意的的是,指向應(yīng)當(dāng)刪除的節(jié)點(diǎn)并無法刪除它,應(yīng)當(dāng)指向該刪除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。 給定一個(gè)鏈表,刪除鏈表的倒數(shù)第 n 個(gè)節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。 Given a linked list, remove the n-th node from the ...
摘要:第題給定一個(gè)鏈表,刪除鏈表的倒數(shù)第個(gè)節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。因?yàn)?,若有一個(gè)真正的頭結(jié)點(diǎn),則所有的元素處理方式都一樣。但以第一個(gè)有效元素為頭結(jié)點(diǎn),就導(dǎo)致算法的不一致,需要單獨(dú)處理第一個(gè)有效元素頭結(jié)點(diǎn)。 leetcode第19題 Given a linked list, remove the n-th node from the end of list and return its h...
摘要:雖然時(shí)間復(fù)雜度還是但是顯然我們可以再一次遍歷中完成這個(gè)任務(wù)?,F(xiàn)在跳出下標(biāo)的思路,從另一個(gè)角度分析??炻?jié)點(diǎn)之間的距離始終是。當(dāng)快節(jié)點(diǎn)到達(dá)終點(diǎn)時(shí),此時(shí)的慢節(jié)點(diǎn)就是所要?jiǎng)h去的節(jié)點(diǎn)。 題目要求 Given a linked list, remove the nth node from the end of list and return its head. For example, ...
摘要:題目詳情題目要求輸入一個(gè)和一個(gè)數(shù)字。要求我們返回刪掉了倒數(shù)第個(gè)節(jié)點(diǎn)的鏈表。想法求倒數(shù)第個(gè)節(jié)點(diǎn),我們將這個(gè)問題轉(zhuǎn)化一下。我們聲明兩個(gè)指針和,讓和指向的節(jié)點(diǎn)距離差保持為。解法使點(diǎn)和點(diǎn)的差距為同時(shí)移動(dòng)和使得到達(dá)的末尾刪除倒數(shù)第個(gè)節(jié)點(diǎn) 題目詳情 Given a linked list, remove the nth node from the end of list and return it...
摘要:這題也是攜程年暑假實(shí)習(xí)生的筆試題。最開始想的解法就是,先循環(huán)求鏈表的長度,再用長度,再循環(huán)一次就能移除該結(jié)點(diǎn)。結(jié)果對的,但是超時(shí)了。再返回整個(gè)鏈表。 Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2...
閱讀 2337·2019-08-30 15:44
閱讀 1260·2019-08-30 13:01
閱讀 3307·2019-08-30 11:22
閱讀 3093·2019-08-29 15:23
閱讀 1614·2019-08-29 12:22
閱讀 3366·2019-08-26 13:58
閱讀 3439·2019-08-26 12:17
閱讀 3479·2019-08-26 12:16