25.K個一組翻轉鏈表
思路:
把鏈表節點按照k個一組分組,可以使用一個指針head依次指向每組的頭節點,這個指針每次向前移動k步,直至鏈表結尾,對于每個分組, 先判斷它的長度是否大于等于k,若是,就翻轉這部分鏈表,否則不需要翻轉
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode hair = new ListNode(0);hair.next = head;ListNode pre = hair;while(head != null){ListNode tail = pre;//查看剩余部分長度是否大于等于kfor(int i = 0 ;i<k;i++){tail = tail.next;if(tail == null){return hair.next;}}ListNode next = tail.next;ListNode[] reverse = Reverse(head,tail);head = reverse[0];tail = reverse[1];//把子鏈表重新接回原鏈表pre.next = head;tail.next = next;pre = tail;head = tail.next;}return hair.next;}//反轉鏈表,返回子鏈表的頭部與尾部public ListNode[] Reverse(ListNode head,ListNode tail){ListNode prev = tail.next;ListNode p = head;while(prev != tail){ListNode next = p.next;p.next = prev;prev = p;p = next;}return new ListNode[]{tail,head};}
}