25. K 个一组翻转链表

Posted 飞上天的虫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了25. K 个一组翻转链表相关的知识,希望对你有一定的参考价值。

25. K 个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

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

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

 

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

 

提示:
  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

解决思路:按块翻转,注意保存关键位置和切分

/**
 * Definition for singly-linked list.
 * public class ListNode 
 *     int val;
 *     ListNode next;
 *     ListNode() 
 *     ListNode(int val)  this.val = val; 
 *     ListNode(int val, ListNode next)  this.val = val; this.next = next; 
 * 
 */
class Solution 
    public ListNode reverseKGroup(ListNode head, int k) 
        ListNode dummy = new ListNode(-1,head);
        // 前一部分已经反转的节点链表
        ListNode pre = dummy;
        // 每次反转部分的尾节点
        ListNode end = dummy;

        while (end.next != null) 
            for (int i = 0; i < k && end != null; i++) end = end.next;
            if (end == null) break;
            //已经反转链表的下一位置即为本次翻转的起始位置
            ListNode start = pre.next;
            //保存之后链表的位置,反转后进行连接
            ListNode next = end.next;
            //切割
            end.next = null;
            //反转并链接前半部分
            pre.next = reverse(start);
            //链接后半部分
            start.next = next;
            //更新下标
            pre = start;
            end = pre;
        
        return dummy.next;
    

    public ListNode reverse(ListNode head) 
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) 
            ListNode tmp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = tmp;
        
        return pre;
    

 

链表题--01----K 个一组翻转链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


K 个一组翻转链表

https://leetcode.com/problems/reverse-nodes-in-k-group/

题目:




分析:



数K个数,返回

	public static ListNode getKGroupEnd(ListNode start, int k) 
		while (--k != 0 && start != null) 
			start = start.next;
		
		return start;
	

链表反转

	public static void reverse(ListNode start, ListNode end) 
		end = end.next;
		ListNode pre = null;
		ListNode cur = start;
		ListNode next = null;
		while (cur != end) 
			next = cur.next;
			cur.next = pre;
			pre = cur;
			cur = next;
		
		start.next = end;
	

总逻辑

代码


// 测试链接:https://leetcode.com/problems/reverse-nodes-in-k-group/
public class Code04_ReverseNodesInKGroup 

	// 不要提交这个类
	public static class ListNode 
		public int val;
		public ListNode next;
	

	public static ListNode reverseKGroup(ListNode head, int k) 
		ListNode start = head;
		ListNode end = getKGroupEnd(start, k);
		if (end == null) 
			return head;
		
		// 第一组凑齐了!
		head = end;
		reverse(start, end);
		// 上一组的结尾节点
		ListNode lastEnd = start;
		while (lastEnd.next != null) 
			start = lastEnd.next;
			end = getKGroupEnd(start, k);
			if (end == null) 
				return head;
			
			reverse(start, end);
			lastEnd.next = end;
			lastEnd = start;
		
		return head;
	

	public static ListNode getKGroupEnd(ListNode start, int k) 
		while (--k != 0 && start != null) 
			start = start.next;
		
		return start;
	

	public static void reverse(ListNode start, ListNode end) 
		end = end.next;
		ListNode pre = null;
		ListNode cur = start;
		ListNode next = null;
		while (cur != end) 
			next = cur.next;
			cur.next = pre;
			pre = cur;
			cur = next;
		
		start.next = end;
	


以上是关于25. K 个一组翻转链表的主要内容,如果未能解决你的问题,请参考以下文章

25. K 个一组翻转链表

25. K 个一组翻转链表

LeetCode 25. K 个一组翻转链表 | Python

25. K 个一组翻转链表

25. K 个一组翻转链表

25. k个一组翻转链表