leetcode演算法題25 K個一組翻轉鍊錶

2021-10-24 21:21:53 字數 1615 閱讀 7947

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

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

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

思路一:這個題與之前兩兩交換鍊錶中的節點很像,只是這次不再是相鄰結點交換了,但思路都差不多一樣,也是用三個指標來做,思路是先讓pre指標指向頭節點dummy,然後根據k的值對鍊錶遍歷,讓cur指標指向第k個結點的下乙個結點,比如對於-1->1->2->3->4->5,k=3來說,pre就指向-1,cur指向3,我們要做的就是翻轉pre和cur之間的鍊錶,使其變為-1->3->2->1->4->5,那麼我們可以專門寫乙個函式來完成這個事情,那麼每次只要固定好pre和cur,就可以呼叫這個函式來完成翻轉的工作。

這個函式該怎麼寫呢?主要思路就是使用三個指標pre、last和cur,分別指向-1,1和2,然後每次都是把cur放到pre後面,讓last的next指向cur的next就行了,比如當完成第一次翻轉後,鍊錶就變為了-1->2->1->3->4->5,這時我們的pre、last和cur分別對應的結點是-1、1和3,把cur的3放到pre後面,然後同樣讓last的next指向cur的next,鍊錶就變為了-1->3->2->1->4->5,如果k為3,則本次翻轉就結束了。

注意是思路要清晰,在紙上畫個鍊錶多寫寫就會發現規律。

class

solution

else

cur=cur-

>next;

}return dummy-

>next;

} listnode*

fanzhuan

(listnode* pre,listnode* next)

return last;}}

;

方法二:與思路一相同,只不過放到了同乙個函式中實現。首先遍歷整個鍊錶,統計出鍊錶的長度,然後如果長度大於等於k,交換節點,當 k=2 時,每段只需要交換一次,當 k=3 時,每段需要交換2此,所以i從1開始迴圈,注意交換一段後更新 pre 指標,然後 num 自減k,直到 numclass

solution

pre = cur;

num -

= k;

}return dummy-

>next;}}

;思路三:也可以使用遞迴來做,用 head 記錄每段的開始位置,cur 記錄結束位置的下乙個節點,然後呼叫 reverse 函式來將這段翻轉,然後得到乙個 new_head,原來的 head 就變成了末尾,這時候後面接上遞迴呼叫下一段得到的新節點,返回 new_head 即可,其實翻轉鍊錶的思想都是一樣的

class

solution

listnode *new_head =

reverse

(head, cur)

; head-

>next =

reversekgroup

(cur, k)

;return new_head;

} listnode*

reverse

(listnode* head, listnode* tail)

return pre;}}

;

LeetCode題解 25 K 個一組翻轉鍊錶

給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1...

leetcode 鍊錶 25 k個一組翻轉鍊錶

給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1 4 ...

25 k個一組翻轉鍊錶

給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1 4 ...