1 #include "000庫函式.h"2
345struct
listnode 9};
10/*
***********************自己解答***************************
*/11
//不含頭結點,鍊錶中的資料按照k個k個地翻轉,使用棧進棧出原理
12class
solution 31}
32}33if
(s.size()) 41}
42return res->next;
4344}45
46};
4748
4950
51/*
******************************部落格答案**************************
*/52
//這道題讓我們以每k個為一組來翻轉鍊錶,實際上是把原鍊錶分成若干小段,
53//
然後分別對其進行翻轉,那麼肯定總共需要兩個函式,乙個是用來分段的,
54//
乙個是用來翻轉的,我們就以題目中給的例子來看,對於給定鍊錶1->2->3->4->5,
55//
一般在處理鍊錶問題時,我們大多時候都會在開頭再加乙個dummy node,因為翻轉鍊錶時頭結點可能會變化
56//
為了記錄當前最新的頭結點的位置而引入的dummy node,那麼我們加入dummy node後的鍊錶變為
57//
- 1->1->2->3->4->5,如果k為3的話,我們的目標是將1, 2, 3翻轉一下,那麼我們需要一些指標
58//
,pre和next分別指向要翻轉的鍊錶的前後的位置,然後翻轉後pre的位置更新到如下新的位置:
5960
6162
//複製**
63//
- 1->1->2->3->4->5
64//
| | |
65//
pre cur next
66//
67//
- 1->3->2->1->4->5
68//
| | |
69//
cur pre next
70//
複製**
7172
73//
以此類推,只要cur走過k個節點,那麼next就是cur->next,
74//
就可以呼叫翻轉函式來進行區域性翻轉了,注意翻轉之後新的cur和pre的位置都不同了,
75//
那麼翻轉之後,cur應該更新為pre->next,而如果不需要翻轉的話,cur更新為cur->next,
7677
7879
//解法一:
//耗時超過自己的解答
8081
class
solution
92else95}
96return dummy->next;97}
98 listnode* reverseonegroup(listnode* pre, listnode*next)
106return
last;
107}
108};
109110
111112
//我們也可以在乙個函式中完成,我們首先遍歷整個鍊錶,統計出鍊錶的長度,
113//
然後如果長度大於等於k,我們開始交換節點,當k = 2時,每段我們只需要交換一次,
114//
當k = 3時,每段需要交換2此,所以i從1開始迴圈,注意交換一段後更新pre指標,然後num自減k
115//
直到num < k時迴圈結束,參見**如下:
116117
118119
//解法二:時間更長!!!!
120121
122class
solution
137 pre =cur;
138 num -=k;
139}
140return dummy->next;
141}
142};
143144
145146
//我們也可以使用遞迴來做,我們用head記錄每段的開始位置,cur記錄結束位置的下乙個節點,
147//
然後我們呼叫reverse函式來將這段翻轉,然後得到乙個new_head,原來的head就變成了末尾,
148//
149150
151class
solution
159 listnode *new_head =reverse(head, cur);
160 head->next =reversekgroup(cur, k);
161return
new_head;
162}
163 listnode* reverse(listnode* head, listnode*tail)
171return
pre;
172}
173};
174175
176void
t025()
185 p = n->next;
186 cout << "原:"
;187
while
(p)
191 cout <192solution s;
193 p = s.reversekgroup(n->next,3
);194 cout << "**"
;195
while
(p)
199 cout <200201
202 }
k個一組翻轉鍊錶
題目描述 給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5當 k 2 時,應當返回 2 1 4 3 5當 k 3 時,應當返回 3 2 1...
K 個一組翻轉鍊錶
給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1...
K個一組翻轉鍊錶
難度困難416收藏分享切換為英文關注反饋 給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。示例 給你這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3...