App下载 微信公众号

K 个一组翻转链表

其他 /  作者【吾非言】/ 发布于2022-9-8/ 2.12k次浏览
2022 9/8 10:19

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例:
图片描述
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

解题思路:

这道题其实记住一点就可以了,每K个节点进行一下反转,反转之后记得拼接成一条新链表,下次反转针对于新的链表进行更改。

代码实现:

public class Solution_113 {

    private static class Node {
        int value;
        Node next;

        public Node(int value) {
            this.value = value;
        }
    }

    public Node reverseKGroup(Node head, int k) {
        if (head == null || head.next == null || k <= 0) return head;

        Node hNode = head;
        Node preNode = null;
        Node startNode = head;

        int index = 0;
        while (head != null) {
            head = head.next;
            index++;

            if (index % k == 0) {
                Node[] nodes = reverse(startNode, head, preNode, head);
                preNode = nodes[1];
                startNode = head;

                if (index / k == 1) {
                    hNode = nodes[0];
                }
            }
        }

        return hNode;
    }

    private Node[] reverse(Node start, Node end, Node head, Node tail) {
        Node lastNode = start;

        Node preNode = null;
        while (start != end) {
            Node temp = start.next;
            start.next = preNode;
            preNode = start;
            start = temp;
        }

        lastNode.next = tail;
        if (head != null) {
            head.next = preNode;
        }

        return new Node[]{preNode, lastNode};
    }

    public static void main(String[] args) {
        Solution_113 solution_113 = new Solution_113();

        Node head = new Node(1);
        Node next = new Node(2);
        Node next1 = new Node(3);
        Node next2 = new Node(4);
        Node next3 = new Node(5);
        head.next = next;
        next.next = next1;
        next1.next = next2;
        next2.next = next3;

        Node res = solution_113.reverseKGroup(head, 2);

        print(res);
    }

    private static void print(Node node) {
        while (node != null) {
            System.out.println(node.value);
            node = node.next;
        }
    }
}
感谢您使用伴职平台,如有侵权,请投诉删除!

全部评价

最新
查看更多评论 加载