Leetcode:NO.25 K 个一组翻转链表

£可爱£侵袭症+ 提交于 2020-08-05 17:48:30

题目

题目链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group

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

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

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

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

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

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

解题记录

  • 更据K的大小分组转换
  • 记录每组头节点和尾节点
  • 循环将头节点的值插入到尾节点的后面
  • 遍历链表直到不满足K大小组出现,跳出
/**
 * @author ffzs
 * @describe K个一组翻转链表
 *
 * 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
 * k 是一个正整数,它的值小于或等于链表的长度。
 *
 * 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

 * 示例:
 *
 * 给你这个链表:1->2->3->4->5
 * 当 k = 2 时,应当返回: 2->1->4->3->5
 * 当 k = 3 时,应当返回: 3->2->1->4->5
 *
 * 说明:
 *
 * 你的算法只能使用常数的额外空间。
 * 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
 *
 * @date 2020/5/16
 */
public class reverseKGroup {

    static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }

        @Override
        public String toString() {
            return "ListNode{" +
                    "val=" + val +
                    ", next=" + next +
                    '}';
        }
    }

    public static ListNode reverseKGroup (ListNode head, int k) {
        if (head==null) return null;
        ListNode res = new ListNode(-1);
        res.next = head;
        head = res;
        ListNode tail = res;
        while (true) {
            for (int i = 0; i < k && tail != null; i++) tail = tail.next;
            if (tail==null) break;
            ListNode pre = head.next;
            while (head.next != tail){
                ListNode tmp = head.next;
                head.next = tmp.next;
                tmp.next = tail.next;
                tail.next = tmp;
            }
            head = pre;
            tail = head;
        }
        return res.next;
    }


    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        ListNode tmp = head;
        int[] lst = {2,3,4,5};
        for (int i :lst){
            tmp.next = new ListNode(i);
            tmp = tmp.next;
        }
        System.out.println(reverseKGroup(head, 2));
    }
}

在这里插入图片描述

进阶

使用递归求解

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public static ListNode reverseKGroup(ListNode head, int k) {
        if (head == null) return null;
        ListNode cur = head;
        int count = 0;
        while (cur != null && count != k) {
            cur = cur.next;
            count++;
        }
        if (count == k) {
            cur = reverseKGroup(cur, k);
            while (count != 0) {
                count--;
                ListNode tmp = head.next;
                head.next = cur;
                cur = head;
                head = tmp;
            }
            head = cur;
        }
        return head;
    }
}

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!