給出一個鏈表,每?k?個節點一組進行翻轉,并返回翻轉后的鏈表。
k?是一個正整數,它的值小于或等于鏈表的長度。如果節點總數不是?k?的整數倍,那么將最后剩余節點保持原有順序。
示例 :
給定這個鏈表:1->2->3->4->5
當?k?= 2 時,應當返回:?2->1->4->3->5
當?k?= 3 時,應當返回:?3->2->1->4->5
說明 :
- 你的算法只能使用常數的額外空間。
- 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
/*** 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 prev = null;ListNode cur = head;ListNode next = null;ListNode check = head;int canProceed = 0;int count = 0;// 檢查鏈表長度是否滿足翻轉while (canProceed < k && check != null) {check = check.next;canProceed++;}// 滿足條件,進行翻轉if (canProceed == k) {while (count < k && cur != null) {next = cur.next;cur.next = prev;prev = cur;cur = next;count++;}if (next != null) {// head 為鏈表翻轉后的尾節點head.next = reverseKGroup(next, k);}// prev 為鏈表翻轉后的頭結點return prev;} else {// 不滿住翻轉條件,直接返回 head 即可return head;}} }
?