摘要:根據(jù)列表的長(zhǎng)度,計(jì)算,也就是最短等價(jià)移動(dòng)次數(shù)。之后利用雙指針,保證頭指針和尾指針之間的距離始終為,從而找到右邊第個(gè)節(jié)點(diǎn)。這時(shí)候還計(jì)算數(shù)組的長(zhǎng)度的話,反而降低了性能。
題目要求
Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL.
其實(shí)這題的描述有些不妥當(dāng),確切的說是將最右側(cè)的節(jié)點(diǎn)依次移到最左側(cè)作為頭結(jié)點(diǎn),一直移動(dòng)到右側(cè)第k個(gè)節(jié)點(diǎn)后結(jié)束。
還是以1->2->3->4->5->NULL為例
k=1 結(jié)果為:5->1->2->3->4->NULL
k=2 結(jié)果為:4->5->1->2->3->NULL
k=3 結(jié)果為:3->4->5->1->2->NULL
k=4 結(jié)果為:2->3->4->5->1->NULL
k=5 結(jié)果為:1->2->3->4->5->NULL
k=6 結(jié)果為:5->1->2->3->4->NULL
換句話說 當(dāng)k的值超過了list的長(zhǎng)度len的時(shí)候,移動(dòng)k次等價(jià)于移動(dòng)k%len次
思路一:計(jì)算出list長(zhǎng)度即通過一次遍歷,找到列表的末節(jié)點(diǎn)同時(shí),計(jì)算出列表的長(zhǎng)度。根據(jù)列表的長(zhǎng)度,計(jì)算k%len,也就是最短等價(jià)移動(dòng)次數(shù)。之后利用雙指針,保證頭指針和尾指針之間的距離始終為k,從而找到右邊第k個(gè)節(jié)點(diǎn)。
public ListNode rotateRight2(ListNode head, int k) { if(k==0 || head==null) return head; //get list length and last node ListNode last = head; int len = 1; while(last.next != null){ last = last.next; len++; } k = k%len; if(k==0) return head; ListNode start = new ListNode(0); start.next = head; int count = len-k; while(count > 0){ start = start.next; count--; } last.next = head; head = start.next; start.next = null; return head; }思路二:簡(jiǎn)單優(yōu)化
其實(shí)在某些情況下,k的值并不一定比數(shù)組的長(zhǎng)度大。這時(shí)候還計(jì)算數(shù)組的長(zhǎng)度的話,反而降低了性能。這個(gè)時(shí)候,可以將遍歷的過程和頭指針的移動(dòng)結(jié)合起來。如果頭指針移動(dòng)到結(jié)尾而k并不是等于0,則可以得知k大于列表長(zhǎng)度,同時(shí)這個(gè)過程還可以得出列表的長(zhǎng)度。如果k等于0時(shí),頭指針未移動(dòng)到末尾,則可以繼續(xù)頭指針和尾指針的同時(shí)移動(dòng),知道頭指針到達(dá)數(shù)組的最后一個(gè)元素。
代碼如下:
public ListNode rotateRight(ListNode head, int k) { if(head == null){ return null; } ListNode firstPointer = head; int length = 0; while(firstPointer!= null && k > 0){ k--; firstPointer = firstPointer.next; length++; } if(k == 0){ if(firstPointer == null){ return head; } ListNode secondPointer = head; while(firstPointer != null && firstPointer.next!=null){ secondPointer = secondPointer.next; firstPointer = firstPointer.next; } firstPointer.next = head; ListNode result = secondPointer.next; secondPointer.next = null; return result; }else{ return rotateRight(head, k%length); } }
想要了解更多開發(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/70111.html
摘要:給定一個(gè)鏈表,旋轉(zhuǎn)鏈表,將鏈表每個(gè)節(jié)點(diǎn)向右移動(dòng)個(gè)位置,其中是非負(fù)數(shù)。按上述思路解,與旋轉(zhuǎn)數(shù)組那道題大同小異,來介紹另一種很簡(jiǎn)單高效的方法。只需在第個(gè)節(jié)點(diǎn)之后切斷,首尾連接即可。另外可能大于鏈表長(zhǎng)度,應(yīng)當(dāng)做求余運(yùn)算。 ?給定一個(gè)鏈表,旋轉(zhuǎn)鏈表,將鏈表每個(gè)節(jié)點(diǎn)向右移動(dòng) k 個(gè)位置,其中 k 是非負(fù)數(shù)。 Given a linked list, rotate the list to the ...
摘要:不過,由于可能大于鏈表的長(zhǎng)度,所以我們要先對(duì)取鏈表長(zhǎng)度的模。代碼計(jì)算鏈表長(zhǎng)度如果不旋轉(zhuǎn)或者原鏈表為空則直接返回讓快指針先走步找到新頭節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)將后半部分放到前面來 Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. For example: Gi...
摘要:而后吾當(dāng)依除取余之法,化大為小,則指針不致于越界也。后欲尋右起第結(jié)點(diǎn),令快指針先行數(shù)日,及至兩指針相距為,便吟鞭東指,與慢指針策馬共進(jìn)??炻羔樢嘀褂谄渌伞N鑴?dòng)長(zhǎng)劍,中宮直入,直取首級(jí),而一掌劈空,已鴻飛冥冥。自此,一代天驕,霸業(yè)已成。 Problem Given a list, rotate the list to the right by k places, where k is...
摘要:小米廣告第三代廣告引擎的設(shè)計(jì)者開發(fā)者負(fù)責(zé)小米應(yīng)用商店日歷開屏廣告業(yè)務(wù)線研發(fā)主導(dǎo)小米廣告引擎多個(gè)模塊重構(gòu)關(guān)注推薦搜索廣告領(lǐng)域相關(guān)知識(shí)給定一個(gè)鏈表,旋轉(zhuǎn)鏈表,將鏈表每個(gè)節(jié)點(diǎn)向右移動(dòng)個(gè)位置,其中是非負(fù)數(shù)。 作者: 碼蹄疾畢業(yè)于哈爾濱工業(yè)大學(xué)。 小米廣告第三代廣告引擎的設(shè)計(jì)者、開發(fā)者;負(fù)責(zé)小米應(yīng)用商店、日歷、開屏廣告業(yè)務(wù)線研發(fā);主導(dǎo)小米廣告引擎多個(gè)模塊重構(gòu);關(guān)注推薦、搜索、廣告領(lǐng)域相關(guān)知識(shí); ...
摘要:小米廣告第三代廣告引擎的設(shè)計(jì)者開發(fā)者負(fù)責(zé)小米應(yīng)用商店日歷開屏廣告業(yè)務(wù)線研發(fā)主導(dǎo)小米廣告引擎多個(gè)模塊重構(gòu)關(guān)注推薦搜索廣告領(lǐng)域相關(guān)知識(shí)給定一個(gè)鏈表,旋轉(zhuǎn)鏈表,將鏈表每個(gè)節(jié)點(diǎn)向右移動(dòng)個(gè)位置,其中是非負(fù)數(shù)。 作者: 碼蹄疾畢業(yè)于哈爾濱工業(yè)大學(xué)。 小米廣告第三代廣告引擎的設(shè)計(jì)者、開發(fā)者;負(fù)責(zé)小米應(yīng)用商店、日歷、開屏廣告業(yè)務(wù)線研發(fā);主導(dǎo)小米廣告引擎多個(gè)模塊重構(gòu);關(guān)注推薦、搜索、廣告領(lǐng)域相關(guān)知識(shí); ...
閱讀 2652·2021-11-11 16:55
閱讀 1289·2021-09-22 15:25
閱讀 1806·2019-08-29 16:26
閱讀 988·2019-08-29 13:21
閱讀 2315·2019-08-23 16:19
閱讀 2803·2019-08-23 15:10
閱讀 784·2019-08-23 14:24
閱讀 1857·2019-08-23 13:48