C++實(shí)現(xiàn)LeetCode(92.倒置鏈表之二)
[LeetCode] 92. Reverse Linked List II 倒置鏈表之二
Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL
很奇怪為何沒(méi)有倒置鏈表之一,就來(lái)了這個(gè)倒置鏈表之二,不過(guò)猜也能猜得到之一就是單純的倒置整個(gè)鏈表,而這道作為延伸的地方就是倒置其中的某一小段。對(duì)于鏈表的問(wèn)題,根據(jù)以往的經(jīng)驗(yàn)一般都是要建一個(gè)dummy node,連上原鏈表的頭結(jié)點(diǎn),這樣的話就算頭結(jié)點(diǎn)變動(dòng)了,我們還可以通過(guò)dummy->next來(lái)獲得新鏈表的頭結(jié)點(diǎn)。這道題的要求是只通過(guò)一次遍歷完成,就拿題目中的例子來(lái)說(shuō),變換的是2,3,4這三個(gè)點(diǎn),我們需要找到第一個(gè)開(kāi)始變換結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn),只要讓pre向后走m-1步即可,為啥要減1呢,因?yàn)轭}目中是從1開(kāi)始計(jì)數(shù)的,這里只走了1步,就是結(jié)點(diǎn)1,用pre指向它。萬(wàn)一是結(jié)點(diǎn)1開(kāi)始變換的怎么辦,這就是我們?yōu)樯兑胐ummy結(jié)點(diǎn)了,pre也可以指向dummy結(jié)點(diǎn)。然后就要開(kāi)始交換了,由于一次只能交換兩個(gè)結(jié)點(diǎn),所以我們按如下的交換順序:
1 -> 2 -> 3 -> 4 -> 5 -> NULL
1 -> 3 -> 2 -> 4 -> 5 -> NULL
1 -> 4 -> 3 -> 2 -> 5 -> NULL
我們可以看出來(lái),總共需要n-m步即可,第一步是將結(jié)點(diǎn)3放到結(jié)點(diǎn)1的后面,第二步將結(jié)點(diǎn)4放到結(jié)點(diǎn)1的后面。這是很有規(guī)律的操作,那么我們就說(shuō)一個(gè)就行了,比如剛開(kāi)始,pre指向結(jié)點(diǎn)1,cur指向結(jié)點(diǎn)2,然后我們建立一個(gè)臨時(shí)的結(jié)點(diǎn)t,指向結(jié)點(diǎn)3(注意我們用臨時(shí)變量保存某個(gè)結(jié)點(diǎn)就是為了首先斷開(kāi)該結(jié)點(diǎn)和前面結(jié)點(diǎn)之間的聯(lián)系,這可以當(dāng)作一個(gè)規(guī)律記下來(lái)),然后我們斷開(kāi)結(jié)點(diǎn)2和結(jié)點(diǎn)3,將結(jié)點(diǎn)2的next連到結(jié)點(diǎn)4上,也就是 cur->next = t->next,再把結(jié)點(diǎn)3連到結(jié)點(diǎn)1的后面結(jié)點(diǎn)(即結(jié)點(diǎn)2)的前面,即 t->next = pre->next,最后再將原來(lái)的結(jié)點(diǎn)1和結(jié)點(diǎn)2的連接斷開(kāi),將結(jié)點(diǎn)1連到結(jié)點(diǎn)3,即 pre->next = t。這樣我們就完成了將結(jié)點(diǎn)3取出,加入結(jié)點(diǎn)1的后方。第二步將結(jié)點(diǎn)4取出,加入結(jié)點(diǎn)1的后方,也是同樣的操作,這里就不多說(shuō)了,請(qǐng)大家自己嘗試下吧,參見(jiàn)代碼如下:
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
ListNode *dummy = new ListNode(-1), *pre = dummy;
dummy->next = head;
for (int i = 0; i < m - 1; ++i) pre = pre->next;
ListNode *cur = pre->next;
for (int i = m; i < n; ++i) {
ListNode *t = cur->next;
cur->next = t->next;
t->next = pre->next;
pre->next = t;
}
return dummy->next;
}
};
到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(倒置鏈表之二)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)倒置鏈表之二內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++實(shí)現(xiàn)LeetCode(647.回文子字符串)
- C++實(shí)現(xiàn)LeetCode(132.拆分回文串之二)
- C++實(shí)現(xiàn)LeetCode(131.拆分回文串)
- C++實(shí)現(xiàn)LeetCode(125.驗(yàn)證回文字符串)
- C++實(shí)現(xiàn)LeetCode(206.倒置鏈表)
- C++實(shí)現(xiàn)LeetCode(2.兩個(gè)數(shù)字相加)
- C++實(shí)現(xiàn)LeetCode(15.三數(shù)之和)
- C++實(shí)現(xiàn)LeetCode(6.字型轉(zhuǎn)換字符串)
相關(guān)文章
用C語(yǔ)言實(shí)現(xiàn)從文本文件中讀取數(shù)據(jù)后進(jìn)行排序的功能
這是一個(gè)十分可靠的程序,這個(gè)程序的查錯(cuò)能力非常強(qiáng)悍。程序包含了文件操作,歸并排序和字符串輸入等多種技術(shù)。對(duì)大家學(xué)習(xí)C語(yǔ)言很有幫助,有需要的一起來(lái)看看。2016-08-08
C++小知識(shí):用合適的工具來(lái)分析你的代碼
今天小編就為大家分享一篇關(guān)于C++小知識(shí):用合適的工具來(lái)分析你的代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
C++11中std::thread線程實(shí)現(xiàn)暫停(掛起)功能
本文主要介紹了C++11中std::thread線程實(shí)現(xiàn)暫停(掛起)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
c++實(shí)現(xiàn)通用參數(shù)解析類示例
使用命令行執(zhí)行程序的時(shí)候在程序后可跟多個(gè)參數(shù)列表,而main函數(shù)的argc和argv分別存儲(chǔ)了相關(guān)的參數(shù)個(gè)數(shù)和參數(shù)內(nèi)容,而循環(huán)輸入相關(guān)的時(shí)候就需要用戶自己來(lái)解析相關(guān)參數(shù)。以下代碼用c++的方式實(shí)現(xiàn)了相關(guān)解析的封裝,使用起來(lái)非常方便2014-03-03
C語(yǔ)言 模擬實(shí)現(xiàn)strcpy與strcat函數(shù)詳解
這篇文章主要介紹了怎樣用C語(yǔ)言模擬實(shí)現(xiàn)strcpy與strcat函數(shù),strcpy()函數(shù)是C語(yǔ)言中的一個(gè)復(fù)制字符串的庫(kù)函數(shù),strcat()函數(shù)的功能是實(shí)現(xiàn)字符串的拼接2022-04-04

