99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

移動旋轉(zhuǎn)鏈表的每個節(jié)點

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:吳師兄學(xué)算法 ? 作者:吳師兄 ? 2022-10-25 18:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、題目描述

給你一個鏈表的頭節(jié)點head,旋轉(zhuǎn)鏈表,將鏈表每個節(jié)點向右移動k個位置。

示例 1:

輸入:head =[1,2,3,4,5], k = 2
輸出:[4,5,1,2,3]

示例 2:

輸入:head =[0,1,2], k = 4
輸出:[2,0,1]
231674e4-4859-11ed-a3b6-dac502259ad0.png

提示:

鏈表中節(jié)點的數(shù)目在范圍 [0, 500] 內(nèi)

-100 <= Node.val <= 100

0 <= k <= 2 * 10^9

原題地址:https://leetcode.cn/problems/rotate-list/

二、題目解析

1、首先遍歷整個鏈表,求出鏈表的長度len。

2、根據(jù)題目的提示,k可能很大,遠(yuǎn)超鏈表的長度,這樣就會導(dǎo)致一種情況,比如 k = 1000,len = 999,每個節(jié)點向右移動 1 個節(jié)點和向右移動 k = 1000 個節(jié)點結(jié)果一樣,所以進行一個取模的操作可以節(jié)省大量的移動操作。

3、接下來設(shè)置兩個指針 former、latter 均指向鏈表的頭節(jié)點,這兩個指針的目的是去尋找出旋轉(zhuǎn)之前的尾節(jié)點位置、旋轉(zhuǎn)成功之后的尾節(jié)點位置

4、先讓former指針先向前移動 k 次,此時,former就和latter相距 k 個節(jié)點了。

5、接下來,讓former、latter同時向后移動,直到former來到了最后一個節(jié)點位置。

23256972-4859-11ed-a3b6-dac502259ad0.png

6、這個時候,從head到latter有len - k個節(jié)點,latter + 1 到 former 有 k 個節(jié)點。

7、也就意味著,latter + 1這個節(jié)點是移動 k 個節(jié)點成功之后的頭節(jié)點。

2330f4c2-4859-11ed-a3b6-dac502259ad0.png

8、只需要返回latter + 1后面這個節(jié)點newHead,并且斷開連接就行了。

三、參考代碼

1、Java 代碼

//登錄AlgoMooc官網(wǎng)獲取更多算法圖解
//https://www.algomooc.com
//作者:程序員吳師兄
//代碼有看不懂的地方一定要私聊咨詢吳師兄呀
//旋轉(zhuǎn)鏈表(LeetCode61)//leetcode.cn/problems/rotate-list/
classSolution{
publicListNoderotateRight(ListNodehead,intk){

//邊界條件判斷
if(head==null){
returnhead;
}

//1、第一步先要計算出鏈表的長度來
intlen=0;

//2、這里我們設(shè)置一個指針指向鏈表的頭節(jié)點的位置
ListNodetempHead=head;

//3、通過不斷的移動tempHead,來獲取鏈表的長度
while(tempHead!=null){

//tempHead不斷向后移動,直到為null
tempHead=tempHead.next;

//每次遍歷一個新的節(jié)點,意味著鏈表長度新增1
len++;

}

//由于題目中的k會超過鏈表的長度,因此進行一個取余的操作
//比如k=1000,len=999
//實際上就是將鏈表每個節(jié)點向右移動1000%999=1個位置就行了
//因為鏈表中的每個節(jié)點移動len次會回到原位
k=k%len;


//4、接下來設(shè)置兩個指針指向鏈表的頭節(jié)點
//這兩個指針的目的是去尋找出旋轉(zhuǎn)之前的尾節(jié)點位置、旋轉(zhuǎn)成功之后的尾節(jié)點位置

//former指針
ListNodeformer=head;

//latter指針
ListNodelatter=head;

//former指針先向前移動k次
for(inti=0;i

2、C++ 代碼

classSolution{
public:
ListNode*rotateRight(ListNode*head,intk){

//邊界條件判斷
if(head==NULL){
returnhead;
}

//1、第一步先要計算出鏈表的長度來
intlen=0;

//2、這里我們設(shè)置一個指針指向鏈表的頭節(jié)點的位置
ListNode*tempHead=head;

//3、通過不斷的移動tempHead,來獲取鏈表的長度
while(tempHead!=NULL){

//tempHead不斷向后移動,直到為NULL
tempHead=tempHead->next;

//每次遍歷一個新的節(jié)點,意味著鏈表長度新增1
len++;

}

//由于題目中的k會超過鏈表的長度,因此進行一個取余的操作
//比如k=1000,len=999
//實際上就是將鏈表每個節(jié)點向右移動1000%999=1個位置就行了
//因為鏈表中的每個節(jié)點移動len次會回到原位
k=k%len;


//4、接下來設(shè)置兩個指針指向鏈表的頭節(jié)點
//這兩個指針的目的是去尋找出旋轉(zhuǎn)之前的尾節(jié)點位置、旋轉(zhuǎn)成功之后的尾節(jié)點位置

//former指針
ListNode*former=head;

//latter指針
ListNode*latter=head;

//former指針先向前移動k次
for(inti=0;inext;

}

//這樣former和latter就相差了k個節(jié)點
//5、接下來,兩個指針同時向后移動,直到former來到了最后一個節(jié)點位置
while(former->next!=NULL){

//former不斷向后移動
former=former->next;

//latter不斷向后移動
latter=latter->next;
}

//6、此時,former指向了最后一個節(jié)點,需要將這個節(jié)點和原鏈表的頭節(jié)點連接起來
former->next=head;

//7、latter指向的節(jié)點的【下一個節(jié)點】是倒數(shù)第k個節(jié)點,那就是旋轉(zhuǎn)成功之后的頭節(jié)點
ListNode*newHead=latter->next;

//8、斷開鏈接,避免成環(huán)
latter->next=NULL;

//9、返回newHead
returnnewHead;

}
};

3、Python 代碼

classSolution:
defrotateRight(self,head:Optional[ListNode],k:int)->Optional[ListNode]:
#邊界條件判斷
ifnotheadork==0:
returnhead

#1、第一步先要計算出鏈表的長度來
_len=0

#2、這里我們設(shè)置一個指針指向鏈表的頭節(jié)點的位置
tempHead=head

#3、通過不斷的移動tempHead,來獲取鏈表的長度
whiletempHead:

#tempHead不斷向后移動,直到為NULL
tempHead=tempHead.next

#每次遍歷一個新的節(jié)點,意味著鏈表長度新增1
_len+=1



#由于題目中的k會超過鏈表的長度,因此進行一個取余的操作
#比如k=1000,len=999
#實際上就是將鏈表每個節(jié)點向右移動1000%999=1個位置就行了
#因為鏈表中的每個節(jié)點移動len次會回到原位
k=k%_len


#4、接下來設(shè)置兩個指針指向鏈表的頭節(jié)點
#這兩個指針的目的是去尋找出旋轉(zhuǎn)之前的尾節(jié)點位置、旋轉(zhuǎn)成功之后的尾節(jié)點位置

#former指針
former=head

#latter指針
latter=head

#former指針先向前移動k次
foriinrange(0,k):

#former不斷向后移動
former=former.next


#這樣former和latter就相差了k個節(jié)點
#5、接下來,兩個指針同時向后移動,直到former來到了最后一個節(jié)點位置
whileformer.next:

#former不斷向后移動
former=former.next

#latter不斷向后移動
latter=latter.next


#6、此時,former指向了最后一個節(jié)點,需要將這個節(jié)點和原鏈表的頭節(jié)點連接起來
former.next=head

#7、latter指向的節(jié)點的【下一個節(jié)點】是倒數(shù)第k個節(jié)點,那就是旋轉(zhuǎn)成功之后的頭節(jié)點
newHead=latter.next

#8、斷開鏈接,避免成環(huán)
latter.next=None

#9、返回newHead
returnnewHead

四、復(fù)雜度分析

時間復(fù)雜度:鏈表一共被遍歷兩次,因此總的時間復(fù)雜度為O(n),n是鏈表的長度。

空間復(fù)雜度:O(1),我們只需要常數(shù)的空間存儲若干變量。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2989

    瀏覽量

    109987

原文標(biāo)題:旋轉(zhuǎn)鏈表(LeetCode 61)

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    C語言-鏈表(單向鏈表、雙向鏈表)

    在前面章節(jié)已經(jīng)學(xué)習(xí)了數(shù)組的使用,數(shù)組的空間是連續(xù)空間,數(shù)組的大小恒定的,在很多動態(tài)數(shù)據(jù)存儲的應(yīng)用場景下,使用不方便;而這篇文章介紹的鏈表結(jié)構(gòu),支持動態(tài)增加節(jié)點,釋放節(jié)點,比較適合存儲動態(tài)數(shù)據(jù)的應(yīng)用場景,而且
    的頭像 發(fā)表于 09-09 11:30 ?2009次閱讀

    C語言實現(xiàn)單鏈表-增刪改查

    鏈表是由一連串節(jié)點組成的數(shù)據(jù)結(jié)構(gòu),每個節(jié)點包含一個數(shù)據(jù)值和一個指向下一個節(jié)點的指針。鏈表可以在頭
    的頭像 發(fā)表于 05-25 15:05 ?1639次閱讀
    C語言實現(xiàn)單<b class='flag-5'>鏈表</b>-增刪改查

    C語言單向鏈表

    本帖最后由 snowmay001 于 2016-5-22 15:57 編輯 lianbiao.cpp/* 練習(xí)使用鏈表:創(chuàng)建鏈表、遍歷鏈表、查找節(jié)點、添加
    發(fā)表于 05-22 15:53

    Linux內(nèi)核的鏈表操作

    ) 搬移Linux提供了將原本屬于一個鏈表節(jié)點移動到另一個鏈表的操作,并根據(jù)插入到新鏈表的位置分為兩類:static inline voi
    發(fā)表于 08-29 11:13

    玩轉(zhuǎn)C語言鏈表-鏈表各類操作詳解

    p節(jié)點之后,已經(jīng)改變了first節(jié)點,所以first節(jié)點應(yīng)該在被修改之前往后移動,不能放到下面注釋的位置上去  first = first->next; //無序
    發(fā)表于 09-18 13:30

    數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作

    嵌入式學(xué)習(xí)基礎(chǔ)-數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作鏈表節(jié)點采用結(jié)構(gòu)體的方式進行定義,下面是最基礎(chǔ)的定義只有一個數(shù)據(jù)data,*pNext用于指向下一個節(jié)點(若為尾
    發(fā)表于 12-22 08:05

    RT-Thread內(nèi)核中雙鏈表的使用與實現(xiàn)

    1. 單鏈表與雙鏈表鏈表: 由一個個節(jié)點(node)組成,每個節(jié)點都有指向下一個
    發(fā)表于 04-01 12:05

    OpenHarmony中的HDF單鏈表及其迭代器

    , or NULL};如上圖所述,每個節(jié)點都是HdfSListNode,上圖共有5個節(jié)點,每個節(jié)點內(nèi)部有一個next成員,其值為下
    發(fā)表于 08-30 10:31

    OpenHarmony中的HDF單鏈表及其迭代器

    , or NULL};如上圖所述,每個節(jié)點都是HdfSListNode,上圖共有5個節(jié)點,每個節(jié)點內(nèi)部有一個next成員,其值為下
    發(fā)表于 09-05 11:38

    C語言基礎(chǔ)教程之鏈表

    (一)什么是鏈表? 鏈表是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,是一種在物理存儲單元上非連續(xù)非順序的存儲結(jié)構(gòu)。 鏈表有一系列節(jié)點構(gòu)成,節(jié)點
    發(fā)表于 11-16 10:22 ?2303次閱讀

    驅(qū)動之路-內(nèi)核鏈表的使用

    kernel list展示的是內(nèi)核鏈表的結(jié)構(gòu),normallist展示的是普通鏈表的結(jié)構(gòu)。head是鏈表頭,p1,p2,p3是鏈表節(jié)點。從圖
    發(fā)表于 05-15 17:24 ?1456次閱讀
    驅(qū)動之路-內(nèi)核<b class='flag-5'>鏈表</b>的使用

    雙向循環(huán)鏈表的創(chuàng)建

    需要注意的是,雖然雙向循環(huán)鏈表成環(huán)狀,但本質(zhì)上還是雙向鏈表,因此在雙向循環(huán)鏈表中,依然能夠找到頭指針和頭節(jié)點等。雙向循環(huán)鏈表和雙向
    的頭像 發(fā)表于 05-24 16:27 ?2380次閱讀

    鏈表的基礎(chǔ)知識

    ,也就是數(shù)組,數(shù)組的每個元素之間的地址是連續(xù)的;對于鏈?zhǔn)酱鎯碚f,也就是平常所說的鏈表,鏈表每個元素之間的地址并不是連續(xù)的,而是分散的,他們之間的聯(lián)系通過結(jié)點的 next 指針來建立。
    的頭像 發(fā)表于 01-20 17:00 ?1442次閱讀
    <b class='flag-5'>鏈表</b>的基礎(chǔ)知識

    鏈表的替代品--Vector組件

    概述 在之前的一篇文章中,作者寫了一個事件組件-- 超精簡的訂閱發(fā)布事件組件--SPEvent ,這個組件是采用鏈表建立所有事件節(jié)點的關(guān)系的。 鏈表的優(yōu)缺點: 優(yōu)點:①鏈表上的元素在空
    的頭像 發(fā)表于 04-06 15:39 ?788次閱讀

    鏈表和雙鏈表的區(qū)別在哪里

    鏈表和雙鏈表的區(qū)別 單鏈表的每一個節(jié)點中只有指向下一個結(jié)點的指針,不能進行回溯。 雙鏈表的每一個節(jié)點
    的頭像 發(fā)表于 07-27 11:20 ?2122次閱讀
    單<b class='flag-5'>鏈表</b>和雙<b class='flag-5'>鏈表</b>的區(qū)別在哪里