【算法题系列之十一】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;
	}

}

 

全部评论

相关推荐

庸也君:简历粗略看,有可能会被paas,如果详细地看的话,简历写的很优秀,很规范,部分内容也有量化
点赞 评论 收藏
分享
04-21 11:22
已编辑
中华女子学院 UE4
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务