- 问题描述
k个一组反转链表。
- 解决方案
代码如下:
public class ReverseKGroup {
public static void main(String[] args){
ListNode root = new ListNode(1);
root.next = new ListNode(2);
root.next.next = new ListNode(3);
root.next.next.next = new ListNode(4);
root.next.next.next.next = new ListNode(5);
root.next.next.next.next.next = new ListNode(6);
ListNode root2 = reverseKGroup(root,5);
while(root2 != null){
System.out.print(root2.val + "->");
root2 = root2.next;
}
}
public static ListNode reverseKGroup(ListNode head,int k){
if(head == null)
return head;
ListNode[] arr = invertHelp(head,k);
ListNode head2 = arr[0];
ListNode result = head2;
ListNode tail = arr[1];
while(tail.next != null){
ListNode[] temp = invertHelp(tail.next,k);
tail.next = temp[0];
tail = temp[1];
}
return result;
}
//给定一个链表,反转前k个节点,然后返回反转部分链表的头和尾
public static ListNode[] invertHelp(ListNode root,int k){
ListNode[] result = new ListNode[2];
ListNode head = root;
ListNode tail = root;
result[0] = head;
result[1] = tail;
int size = 1;
while(tail.next != null && size < k){
ListNode next = tail.next.next;
ListNode cur = tail.next;
cur.next = head;
head = cur;
tail.next = next;
result[0] = head;
result[1] = tail;
size ++;
}
if(size != k)
return invertHelp( result[0],size);
return result;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}