Leetcode25 K 个一组翻转链表 [Hard] -JAVA

题目传送门

Leetcode25 K 个一组翻转链表 [Hard] -JAVA

题目

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

思路

题意就是将链表分组,以组为单位进行反转。
首先先理解下反转链表的实现,就是1->2->3 变成 1<-2<-3,就是把箭头调换一下。参与下面代码理解。
理解完反转代码后,我们现在针对此题目就是要加一个条件,分段来,以k个为一个组,那我们就是count 计算下,遍历到k个就把range 为start ~ tail 部分当前一个小链表进行反转。
看下面代码吧!

补充-链表反转

public ListNode reverse (ListNode head) {
	if(head == null) return head;
	// head 就是我
	ListNode pre = null; // 在我前面的节点,初始化时,因为第一个节点反转后 要变成最后一个节点,最后一个节点的标志就是next 为null,所以让我的头节点为null.等会就会接在我后面啦。
	while(head!=null) { // 结束条件: 是不是到底了   (head 就是当前的节点)
		ListNode next = head.next; // 因为要调转箭头指向了嘛,也就是原来的接在我后面的节点将不是这个head.next,要转交到别人手上了,所以保存下,别弄丢了,为什么要保存?剧透下,head.next 就是下一个要反转的对象
		head.next = pre; // 把原先在我前面的节点变成我的下一个节点,箭头就换了吖。
		pre = head;//当前节点的交换任务已经完成,我就要变成过去啦,所以给pre
		head = next;// 开始下一个节点的操作,而这个下一个节点就是刚next 暂存的值 
	}
	return pre;
}

解法

class Solution {
     public ListNode reverseKGroup (ListNode head, int k) {
        ListNode dummy = new ListNode(0); // 哨兵,为了不想特殊处理头节点,头节点和别人不一样,没有前驱节点,所以给个假头,后面就可以统一方法处理,很多链表题都是这种写法
        dummy.next = head;
        ListNode pre = dummy;
        ListNode tail = dummy;
        while (true) {
            int count = 0;
            while (tail != null && count != k) { // 计算count,一旦找到等于k这个机会,就进行反转
                count++;
                tail = tail.next;
            }

            if (tail == null) break; // 退出条件
            ListNode head1 = pre.next;
            while (pre.next!=tail){ // 反转的结束条件: 是不是到底了,也就是我是不是等于尾节点了 
                ListNode cur = pre.next; 
                pre.next = cur.next;
                cur.next = tail.next;
                tail.next = cur;
            }
            pre = head1; //新的起点,准备开始新一轮计算,反转
            tail = head1;
        }
        return dummy.next;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值