摘要:雖然時(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, Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5. Note: Given n will always be valid. Try to do this in one pass.
題意就是,從鏈表中移除倒數(shù)第n個(gè)節(jié)點(diǎn)(前提是這個(gè)被移除的節(jié)點(diǎn)一定存在)
思路一:利用數(shù)據(jù)結(jié)構(gòu)ArrayList從題目中可知,如果我們知道這個(gè)鏈表的大小,就可以直接刪去節(jié)點(diǎn)。所以按照正常思路,我們可以先從根節(jié)點(diǎn)遍歷一遍這個(gè)鏈表,得出鏈表的size后,再刪去倒數(shù)第n個(gè),也就是正數(shù)第size-n個(gè)節(jié)點(diǎn)。這樣意味著遍歷兩次這個(gè)鏈表。雖然時(shí)間復(fù)雜度還是O(n),但是顯然我們可以再一次遍歷中完成這個(gè)任務(wù)。思路一就是將ArrayList和LinkedList相結(jié)合起來,通過ArrayList的下標(biāo)完成要求
public class RemoveNthNodeFromEndofList_19 { public ListNode removeNthFromEnd(ListNode head, int n) { List思路二:利用快慢指針nodeList = new ArrayList (); ListNode start = new ListNode(0); start.next = head; nodeList.add(start); while(head != null){ nodeList.add(head); head = head.next; } int index = nodeList.size() - n; nodeList.get(index-1).next = nodeList.get(index).next; return nodeList.get(0).next; } public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } }
思路一直接利用了ArrayList的下標(biāo)完成了任務(wù)?,F(xiàn)在跳出下標(biāo)的思路,從另一個(gè)角度分析。直接從題目要求入手,如果我們獲得最后一個(gè)節(jié)點(diǎn),那么到最后一個(gè)節(jié)點(diǎn)的距離為n的就是我們所要?jiǎng)h去的節(jié)點(diǎn)。我們可以使用快慢節(jié)點(diǎn)。快慢節(jié)點(diǎn)之間的距離始終是n。當(dāng)快節(jié)點(diǎn)到達(dá)終點(diǎn)時(shí),此時(shí)的慢節(jié)點(diǎn)就是所要?jiǎng)h去的節(jié)點(diǎn)。
相比于上一種方法,這種方法也只需要一次遍歷,而且占用的額外存儲(chǔ)空間更小。
public class RemoveNthNodeFromEndofList_19 { public ListNode removeNthFromEnd2(ListNode head, int n) { ListNode start = new ListNode(0); start.next = head; ListNode slow = start; ListNode fast = start; for(int i = 0 ; i
想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66985.html
摘要:這題也是攜程年暑假實(shí)習(xí)生的筆試題。最開始想的解法就是,先循環(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...
摘要:題目詳情題目要求輸入一個(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...
摘要:第題給定一個(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...
摘要:給定一個(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)。示例給定一個(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 ...
閱讀 2784·2021-11-23 09:51
閱讀 3539·2021-10-08 10:17
閱讀 1273·2021-10-08 10:05
閱讀 1327·2021-09-28 09:36
閱讀 1846·2021-09-13 10:30
閱讀 2186·2021-08-17 10:12
閱讀 1682·2019-08-30 15:54
閱讀 2011·2019-08-30 15:53