C++實現(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
很奇怪為何沒有倒置鏈表之一,就來了這個倒置鏈表之二,不過猜也能猜得到之一就是單純的倒置整個鏈表,而這道作為延伸的地方就是倒置其中的某一小段。對于鏈表的問題,根據(jù)以往的經(jīng)驗一般都是要建一個dummy node,連上原鏈表的頭結(jié)點,這樣的話就算頭結(jié)點變動了,我們還可以通過dummy->next來獲得新鏈表的頭結(jié)點。這道題的要求是只通過一次遍歷完成,就拿題目中的例子來說,變換的是2,3,4這三個點,我們需要找到第一個開始變換結(jié)點的前一個結(jié)點,只要讓pre向后走m-1步即可,為啥要減1呢,因為題目中是從1開始計數(shù)的,這里只走了1步,就是結(jié)點1,用pre指向它。萬一是結(jié)點1開始變換的怎么辦,這就是我們?yōu)樯兑胐ummy結(jié)點了,pre也可以指向dummy結(jié)點。然后就要開始交換了,由于一次只能交換兩個結(jié)點,所以我們按如下的交換順序:
1 -> 2 -> 3 -> 4 -> 5 -> NULL
1 -> 3 -> 2 -> 4 -> 5 -> NULL
1 -> 4 -> 3 -> 2 -> 5 -> NULL
我們可以看出來,總共需要n-m步即可,第一步是將結(jié)點3放到結(jié)點1的后面,第二步將結(jié)點4放到結(jié)點1的后面。這是很有規(guī)律的操作,那么我們就說一個就行了,比如剛開始,pre指向結(jié)點1,cur指向結(jié)點2,然后我們建立一個臨時的結(jié)點t,指向結(jié)點3(注意我們用臨時變量保存某個結(jié)點就是為了首先斷開該結(jié)點和前面結(jié)點之間的聯(lián)系,這可以當作一個規(guī)律記下來),然后我們斷開結(jié)點2和結(jié)點3,將結(jié)點2的next連到結(jié)點4上,也就是 cur->next = t->next,再把結(jié)點3連到結(jié)點1的后面結(jié)點(即結(jié)點2)的前面,即 t->next = pre->next,最后再將原來的結(jié)點1和結(jié)點2的連接斷開,將結(jié)點1連到結(jié)點3,即 pre->next = t。這樣我們就完成了將結(jié)點3取出,加入結(jié)點1的后方。第二步將結(jié)點4取出,加入結(jié)點1的后方,也是同樣的操作,這里就不多說了,請大家自己嘗試下吧,參見代碼如下:
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++實現(xiàn)LeetCode(倒置鏈表之二)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)倒置鏈表之二內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解
本篇文章是對C/C++浮點數(shù)在內(nèi)存中的存儲方式進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C/C++程序開發(fā)中實現(xiàn)信息隱藏的三種類型
這篇文章主要介紹了C/C++程序開發(fā)中實現(xiàn)信息隱藏的三種類型的相關(guān)資料,需要的朋友可以參考下2016-02-02
詳解C語言內(nèi)核中的鏈表與結(jié)構(gòu)體
Windows內(nèi)核中是無法使用vector容器等數(shù)據(jù)結(jié)構(gòu)的,當我們需要保存一個結(jié)構(gòu)體數(shù)組時,就需要使用內(nèi)核中提供的專用鏈表結(jié)構(gòu)。本文分享了幾個內(nèi)核中使用鏈表存儲多個結(jié)構(gòu)體的通用案例,希望對你有所幫助2022-09-09
Qt數(shù)據(jù)庫應用之實現(xiàn)數(shù)據(jù)分組導出
這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)數(shù)據(jù)庫數(shù)據(jù)分組導出,文中的示例代碼講解詳細,對我們學習或工作有一定參考價值,需要的可以了解一下2022-06-06

