025k個一組翻轉鍊錶

2022-06-04 12:30:11 字數 2970 閱讀 4436

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...