題目
將給出的鏈表中的節點每 k 個一組翻轉,返回翻轉后的鏈表
如果鏈表中的節點數不是 k 的倍數,將最后剩下的節點保持原樣
你不能更改節點中的值,只能更改節點本身。
要求空間復雜度 O(1)
例如:
給定的鏈表是1→2→3→4→5
對於 k=2, 你應該返回 2→1→4→3→5
對於 k=3, 你應該返回 3→2→1→4→5
題目分析
這里我借用一個大神化的過程圖,寫的真好看
思路:先計算鏈表長度根據k計算需要翻轉幾輪,每一輪就采取頭插法實現翻轉
代碼(有注釋):
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
if(head==null||head.next==null||k<2){
return head;
}
//構造一個新的頭節點,方便返回值時找到反轉后鏈表的頭節點。
ListNode res = new ListNode(0);
res.next = head;
//定義三個指針
ListNode pre = res,cur=head,tmp=null;
//鏈表長度
int length = 0;
while(head!=null){
length++;
head = head.next;
}
//循環幾次,每次k個,這里也是采用頭插法的方式
//pre作為每一小段鏈表的頭節點,負責銜接
for(int i = 0;i<length/k;i++){
for(int j=1;j<k;j++){
tmp = cur.next;
cur.next = tmp.next;
tmp.next = pre.next;
pre.next = tmp;
}
//每個子序列反序完成后,pre,cur需要更新至下一子序列的頭部
pre = cur;
cur = cur.next;
}
return res.next;
}