題目描述
給你一個鏈表,每 k 個節(jié)點一組進行翻轉(zhuǎn),請你返回翻轉(zhuǎn)后的鏈表。
k 是一個正整數(shù),它的值小于或等于鏈表的長度。
如果節(jié)點總數(shù)不是 k 的整數(shù)倍,那么請將最后剩余的節(jié)點保持原有順序。
相關(guān)話題:?鏈表 ???難度:?困難
示例 :
給定這個鏈表:1->2->3->4->5
當 k = 2 時,應(yīng)當返回: 2->1->4->3->5
當 k = 3 時,應(yīng)當返回: 3->2->1->4->5
說明 :
- 你的算法只能使用常數(shù)的額外空間。
- 你不能只是單純的改變節(jié)點內(nèi)部的值,而是需要實際的進行節(jié)點交換。
思路:
思路很簡單,基本方法和反轉(zhuǎn)鏈表 II一樣。
主要是確定邊界,因為有可能最后剩余的節(jié)點不足k個。
- 定義兩個指針
p和q,p和q開始都指向子區(qū)間的開頭節(jié)點的前驅(qū) - 先讓
q走k步,如果走完k步,q != null則表示夠k個,否則不夠,直接結(jié)束 - 反轉(zhuǎn)完一個子區(qū)間的節(jié)點,更新
p和q的指向
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
ListNode p = head, q = p;
ListNode cur = null;
while(q != null){
//讓q先跑k步,判斷區(qū)間內(nèi)節(jié)點是否夠k個
for(int i = 0;i < k && q != null;i++){
q = q.next;
}
//不夠k個,直接跳出
if(q == null) break;
//否則反轉(zhuǎn)子區(qū)間內(nèi)的節(jié)點
cur = p.next;
for(int i = 1;i < k;i++){
ListNode x = cur.next;
cur.next = x.next;
x.next = p.next;
p.next = x;
}
//開始下一個區(qū)間
p = cur;
q = p;
}
return head.next;
}
}