k 節點鍊錶翻轉

2021-10-06 21:20:59 字數 2366 閱讀 6468

給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。

k 是乙個正整數,它的值小於或等於鍊錶的長度。

如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。

示例:給你這個鍊錶:1->2->3->4->5

當 k = 2 時,應當返回: 2->1->4->3->5

當 k = 3 時,應當返回: 3->2->1->4->5

說明:你的演算法只能使用常數的額外空間。

你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。

tip:

1. 遞迴

2. 關鍵是要儲存每次的head, 下一次的head, 還要將兩次翻轉鏈結,所以還需要每次的尾節點。

head -> ⋯

\cdots

⋯ -> tail -> nexthead

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

return

reverseknode

(head, k);}

listnode *

getlastnode

(listnode *head,

int k)

return tail;

} listnode *

reverseknode

(listnode *head,

int k)

listnode *nexthead = result-

>next;

/* 保持下一次待翻轉的鍊錶的頭 */

listnode *temp = result;

int tempk = k;

while

(--tempk)

temp-

>next = nexthead;

temp-

>next =

reverseknode

(nexthead, k)

;/* 遞迴:下一輪翻轉 */

return result;}}

;

給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: 1->2->3->4->5->null, k = 2

輸出: 4->5->1->2->3->null

解釋:向右旋轉 1 步: 5->1->2->3->4->null

向右旋轉 2 步: 4->5->1->2->3->null

示例 2:

輸入: 0->1->2->null, k = 4

輸出: 2->0->1->null

解釋:向右旋轉 1 步: 2->0->1->null

向右旋轉 2 步: 1->2->0->null

向右旋轉 3 步: 0->1->2->null

向右旋轉 4 步: 2->0->1->null

統計長度和找到尾節點

左旋變右旋

找到右旋之後的首節點

將原來的首節點鏈結在位節點後

新的尾節點的next賦值null

/**

* definition for singly-linked list.

* struct listnode

* };

*/#define __debug__ 0

class

solution

listnode *tail =

null

;int cnt =

gettotallen

(head,

&tail)

;int step = cnt - k % cnt;

/* 右旋變左旋 */

if(step == cnt)

listnode *temp = head;

listnode *newhead;

listnode *newtail;

while

(--step >=0)

newhead = temp;

/* 將前面的點左旋到尾節點後面 */

tail-

>next = head;

newtail-

>next =

null

;return newhead;

}int

gettotallen

(listnode *head, listnode *

*tail)

*tail = head;

return cnt;}}

;

鍊錶K個節點翻轉

題目描述 結果分析 題目思路 利用棧的先進後出的性質,1 將需要翻轉的結點壓入棧中 2 將需要翻轉的最後一節結點的後乙個結點儲存下來 3 定義乙個頭結點,將棧中結點,取棧頂結點,鏈結起來 4 當棧中資料全部取出後,將儲存的後乙個結點鏈結起來 返回頭結點即可。實現 listnode rotatelis...

鍊錶的K組翻轉問題

在這兩天的刷題中,遇到乙個求鍊錶的翻轉問題,坦白講,這個問題我想得思路有很多種,但在這麼多種的思路中,沒有乙個是能夠輕易實現的。題目如下。鍊錶翻轉。給出乙個鍊錶和乙個數k,比如鍊錶1 2 3 4 5 6,k 2,翻轉後2 1 4 3 6 5,若k 3,翻轉後3 2 1 6 5 4,若k 4,翻轉後4...

450 K組翻轉鍊錶

中文english 給你乙個鍊錶以及乙個k,將這個鍊錶從頭指標開始每k個翻轉一下。鍊錶元素個數不是k的倍數,最後剩餘的不用翻轉。example 1 input list 1 2 3 4 5 null k 2 output 2 1 4 3 5example 2 input list 1 2 3 4 5...