給出一個鏈表,每 k 個節點一組進行翻轉,並返回翻轉后的鏈表。
k 是一個正整數,它的值小於或等於鏈表的長度。如果節點總數不是 k 的整數倍,那么將最后剩余節點保持原有順序。
示例 :
給定這個鏈表:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 3 時,應當返回: 3->2->1->4->5
public ListNode reverseKGroup(ListNode head, int k) { if(head == null) return head; //獲取長度 int len = getLength(head); //t表示可以逆轉幾組 int t = len/k; //定義虛擬頭結點 ListNode dummy = new ListNode(-1); //定義sign標記結點 ListNode sign = dummy; dummy.next = head; ListNode f = head; ListNode s = f.next; while(t>0){ int m = k; //三指針逆轉 while(m>1&&f!=null){ f.next = s.next; s.next = sign.next; sign.next = s; s = f.next; m--; } //讓sign指向當前f sign = f; //f指向當前s f = s; //判斷f是否為空,為空直接返回 if(f == null) break; //s指向s.next s = s.next; //逆轉次數減一 t--; } return dummy.next; } public static int getLength(ListNode head){ ListNode cur = head; int count = 0; while(cur!=null){ cur = cur.next; count++; } return count; }