K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
这里就是一个简单的翻转链表的题,主要的问题就是其实也是用到了递归调用,然后在翻转的时候reverse函数也和之前有一点点的区别,这里多加了一个变量,是终止节点tail,当碰到tail时翻转结束
public class Solution005 {
public static void main(String[] args) {
ListNode l5 = new ListNode(5),
l4 = new ListNode(4,l5),
l3 = new ListNode(3,l4),
l2 = new ListNode(2,l3),
l1 = new ListNode(1,l2);
ListNode cur = l1;
while(cur!=null){
System.out.print(cur.value+" ");
cur=cur.next;
}
ListNode node = reverseKGroup(l1, 2);
System.out.println("翻转后");
cur = node;
while(cur!=null){
System.out.print(cur.value+" ");
cur=cur.next;
}
}
//K个一组翻转链表
public static ListNode reverseKGroup(ListNode head, int k){
if(head==null || head.next==null) return head;
//先进行判断链表的长度是否小于k 小于k则直接返回 不用翻转了 同时找到尾部去
ListNode cur = head;
for(int i=0;i<k;i++){
if(cur==null) return head;
else cur=cur.next;
}
//此时的cur就是第k+1个节点
//对前面的K个节点进行翻转
ListNode newhead = reverse(head, cur);
//翻转完之后就是head是最后一个节点
head.next= reverseKGroup(cur,k);
return newhead;
}
//翻转链表 这里用的递归法 这里翻转的终止条件不是到末尾 是到tail节点就结束
public static ListNode reverse(ListNode node,ListNode tail){
//因为这里是到tail时 翻转结束 所以终止条件是碰到tail
if(node==tail || node.next==tail) return node;
ListNode newhead = reverse(node.next,tail);
//转向
node.next.next = node;
node.next=null;
return newhead;
}
static class ListNode{
int value;
ListNode next;
private ListNode(){}
private ListNode(int value){
this.value=value;
}
private ListNode(int value,ListNode next){
this.value=value;
this.next=next;
}
}
}
补充:又看到一个说是要去最后小于K的链表也要翻转,那么只需要将上面的代码修改一下即可:将对于K的判断修改为当后续链表长度不足K时直接break即可
//K个一组翻转链表
public static ListNode reverseKGroup(ListNode head, int k){
if(head==null || head.next==null) return head;
//先进行判断链表的长度是否小于k 小于k则直接返回 不用翻转了 同时找到尾部去
ListNode cur = head;
for(int i=0;i<k;i++){
if(cur==null) break;
else cur=cur.next;
}
//此时的cur就是第k+1个节点
//对前面的K个节点进行翻转
ListNode newhead = reverse(head, cur);
//翻转完之后就是head是最后一个节点
head.next= reverseKGroup(cur,k);
return newhead;
}