在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

算法與數(shù)據結構 ? 來源:吳師兄學算法 ? 作者:吳師兄 ? 2022-10-25 18:05 ? 次閱讀

一、題目描述

給你一個鏈表的頭節(jié)點head,旋轉鏈表,將鏈表每個節(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] 內

-100 <= Node.val <= 100

0 <= k <= 2 * 10^9

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

二、題目解析

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

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

3、接下來設置兩個指針 former、latter 均指向鏈表的頭節(jié)點,這兩個指針的目的是去尋找出旋轉之前的尾節(jié)點位置、旋轉成功之后的尾節(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官網獲取更多算法圖解
//https://www.algomooc.com
//作者:程序員吳師兄
//代碼有看不懂的地方一定要私聊咨詢吳師兄呀
//旋轉鏈表(LeetCode61)//leetcode.cn/problems/rotate-list/
classSolution{
publicListNoderotateRight(ListNodehead,intk){

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

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

//2、這里我們設置一個指針指向鏈表的頭節(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、接下來設置兩個指針指向鏈表的頭節(jié)點
//這兩個指針的目的是去尋找出旋轉之前的尾節(jié)點位置、旋轉成功之后的尾節(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、這里我們設置一個指針指向鏈表的頭節(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、接下來設置兩個指針指向鏈表的頭節(jié)點
//這兩個指針的目的是去尋找出旋轉之前的尾節(jié)點位置、旋轉成功之后的尾節(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é)點,那就是旋轉成功之后的頭節(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、這里我們設置一個指針指向鏈表的頭節(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、接下來設置兩個指針指向鏈表的頭節(jié)點
#這兩個指針的目的是去尋找出旋轉之前的尾節(jié)點位置、旋轉成功之后的尾節(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é)點,那就是旋轉成功之后的頭節(jié)點
newHead=latter.next

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

#9、返回newHead
returnnewHead

四、復雜度分析

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

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





審核編輯:劉清

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

    關注

    19

    文章

    2976

    瀏覽量

    105215

原文標題:旋轉鏈表(LeetCode 61)

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

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

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

    C語言單向鏈表

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

    Linux內核的鏈表操作

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

    玩轉C語言鏈表-鏈表各類操作詳解

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

    數(shù)據結構鏈表的基本操作

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

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

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

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

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

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

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

    C語言基礎教程之鏈表

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

    驅動之路-內核鏈表的使用

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

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

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

    鏈表的基礎知識

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

    鏈表的替代品--Vector組件

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

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

    鏈表和雙鏈表的區(qū)別 單鏈表的每一個節(jié)點中只有指向下一個結點的指針,不能進行回溯。 雙鏈表的每一個節(jié)點
    的頭像 發(fā)表于 07-27 11:20 ?1789次閱讀
    單<b class='flag-5'>鏈表</b>和雙<b class='flag-5'>鏈表</b>的區(qū)別在哪里
    主站蜘蛛池模板: 九九热在线视频观看 | 在线视频观看免费 | 麦克斯奥特曼免费观看 | 日本网站免费 | 人人揉揉香蕉大免费不卡 | 日日噜噜爽爽狠狠视频 | 清朝荒淫牲艳史在线播放 | 日本五十交尾在线观看 | 人人爱人人插 | 亚洲小便 | 黄色免费网站视频 | 天天爽天天 | 中国一级特黄特级毛片 | 五月四房婷婷 | 性夜影院爽黄a爽免费视 | 女a男0攻巨肉高h | 美女禁处 | 日本黄视频在线观看 | 你懂得在线网址 | 天堂成人在线观看 | 日韩美女拍拍免费视频网站 | 欧美经典三级春潮烂漫海棠红 | 国产最好的精华液网站 | 欧美一欧美一区二三区性 | 中文字幕一区二区三区四区 | 91成人免费福利网站在线 | 人人免费操 | 性夜影院爽黄a爽免费视 | 九月婷婷综合婷婷 | 婷婷亚洲视频 | 免费国产午夜高清在线视频 | 有一婷婷色 | 四虎国产精品永免费 | 看片地址 | 久久全国免费久久青青小草 | 91老色批网站免费看 | 免费观看黄视频 | 午夜短视频 | 午夜免费在线观看 | 亚洲人成电影在线观看网 | 亚洲午夜视频 |