摘要:給定一個(gè)鏈表,刪除鏈表的倒數(shù)第個(gè)節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。示例給定一個(gè)鏈表和當(dāng)刪除了倒數(shù)第二個(gè)節(jié)點(diǎn)后,鏈表變?yōu)檎f(shuō)明給定的保證是有效的。值得注意的的是,指向應(yīng)當(dāng)刪除的節(jié)點(diǎn)并無(wú)法刪除它,應(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.
說(shuō)明:
給定的 n 保證是有效的。
Note:
Given n will always be valid.
進(jìn)階:
你能嘗試使用一趟掃描實(shí)現(xiàn)嗎?
Follow up:
Could you do this in one pass?
解題思路:這道題很有意思,雖然很簡(jiǎn)單,但是很考驗(yàn)一個(gè)人的思維。最先想到的方法就是遍歷整個(gè)鏈表得到長(zhǎng)度,減去 n 得到實(shí)際應(yīng)該刪除的節(jié)點(diǎn)的位置了。然而由于單鏈表刪除操作的特殊性,得到位置之后仍然需要再遍歷一次來(lái)刪除該節(jié)點(diǎn)。
進(jìn)階要求是一次遍歷完成該題,想想是否有好的方法?
假設(shè)鏈表長(zhǎng)度為 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)并無(wú)法刪除它,應(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;//將本來(lái)指向應(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)一起刷題:愛(ài)寫(xiě)B(tài)ug
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75546.html
摘要:給定一個(gè)鏈表,刪除鏈表的倒數(shù)第個(gè)節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。示例給定一個(gè)鏈表和當(dāng)刪除了倒數(shù)第二個(gè)節(jié)點(diǎn)后,鏈表變?yōu)檎f(shuō)明給定的保證是有效的。值得注意的的是,指向應(yīng)當(dāng)刪除的節(jié)點(diǎn)并無(wú)法刪除它,應(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è)問(wèn)題轉(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í)生的筆試題。最開(kāi)始想的解法就是,先循環(huán)求鏈表的長(zhǎng)度,再用長(zhǎng)度,再循環(huán)一次就能移除該結(jié)點(diǎn)。結(jié)果對(duì)的,但是超時(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...
閱讀 587·2023-04-25 21:29
閱讀 1119·2023-04-25 21:27
閱讀 1059·2021-11-25 09:43
閱讀 1091·2021-09-29 09:43
閱讀 3626·2021-09-03 10:30
閱讀 2864·2019-08-29 15:26
閱讀 2812·2019-08-29 12:52
閱讀 1753·2019-08-29 11:10