BM3 链表中的节点每k个一组反转

import java.util.*;

/*

 * public class ListNode {

 *   int val;

 *   ListNode next = null;

 *   public ListNode(int val) {

 *     this.val = val;

 *   }

 * }

 */

如果头结点为空,或者头结点没有指向下一个节点,直接返回

public class Solution {

    public ListNode reverseKGroup (ListNode head, int k) {

        // write code here

                if (head == null || head.next == null) {

                            return head;

      }

        //创建一个虚拟的节点

ListNode dummy = new ListNode(-1);

        //让dummy指向head

        dummy.next = head;

        //创建两个空指针,指向虚拟节点

        ListNode pre = dummy;

        ListNode end = dummy;

//while循环判断end.next是否遍历到了最后一个节点,K个节点为一组

while (end.next != null) {

            for (int i = 0; i < k && end != null; i++) {

                end = end.next;

            }

            //如果K的值大于剩下的节点数,那就保持不变,跳出循环

            if (end == null) {

                break;

            }

            //上述循环走完,end已经走到了反转区域的最后一个节点,用一个指针记录下一个节点的地址

            ListNode cur = end.next;

            //断掉与end相连的节点

            end.next = null;

            //创建一个指针用来记录反转区域的第一个节点

            ListNode start = pre.next;

            //断掉与头节点的连接

            pre.next = null;

            //将反转区域进行反转,pre.next要与反转后的链表进行连接

            pre.next = reverseList(start);

            //待反转区域需要把指针及时更新,start.next = cur把尾巴连起来

            start.next = cur;

            pre = start;

            end = start;

        }

       

        //最终返回dummy.next

        return  dummy.next;

    }

    //采用递归的方式,反转链表

private ListNode reverseList(ListNode head) {

        //递归出口,最后cur指向为5,然后返回的head指向为4

        if (head == null || head.next == null) {

            return head;

        }

        ListNode cur = reverseList(head.next);

        head.next.next = head;

        head.next = null;

        //cur最终返回到反转区域的第一个节点

        return cur;

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值