【算法系列之十一】k个一组翻转链表

给出一个链表,每 个节点一组进行翻转,并返回翻转后的链表。

是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 的整数倍,那么将最后剩余节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 = 2 时,应当返回: 2->1->4->3->5

当 = 3 时,应当返回: 3->2->1->4->5

public class ReverseNodesInkGroup {
	
	public static void main(String[] args) {
		// 1 -> 2 -> 3 -> 4 -> 5
		ListNode node1 = new ListNode(1);
		ListNode node2 = new ListNode(2);
		ListNode node3 = new ListNode(3);
		ListNode node4 = new ListNode(4);
		ListNode node5 = new ListNode(5);
		node1.next = node2;
		node2.next = node3;
		node3.next = node4;
		node4.next = node5;
		ListNode reverseKGroup = reverseKGroup(node1, 3);
		System.out.println("=================");
		while (reverseKGroup != null) {
			System.out.println(reverseKGroup.val);
			reverseKGroup = reverseKGroup.next;
		}
	}
	
	public static ListNode reverseKGroup(ListNode head, int k) {
		ListNode currentNode = head;
		int count = 0;
		while (currentNode != null && count != k) { // 每k个节点一组分隔
		    currentNode = currentNode.next;
		    count++;
		}
		if (count == k) {
		    currentNode = reverseKGroup(currentNode, k);/// 递归的解决子问题
		    while (count-- > 0) { // 将头节点从链表中切掉,放在下一组链表的前端,切除k次,即可将链表翻转
		        ListNode temp = head.next; // 保存该组链表的第二个节点
		        head.next = currentNode; // head节点的下一位指向currentNode(第一次循环时是下一组链表的头节点,之后每截取一次就往前移)
		        currentNode = head;  // currentNode节点前移到head
		        head = temp; // head节点重新指向该组的第一个节点,开始下次循环
		    }
		    head = currentNode; //最终,该段的所有节点将会截空,head应指向currentNode
		}
		return head;
	}

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值