一次没写出来的面试手撕

要实现按照 k 个一组反转链表的功能,
先将链表按每 k 个节点一组进行划分。
对每一组节点进行反转操作。
将反转后的组重新连接起来。

链表 1->2->3->4->5->6->7,
然后需要按照k个一组反转
比如k=2,那么需要得到2->1->4->3->6->5->7
k=3,得到3->2->1->6->5->4->7

```
// 定义链表节点类
class ListNode {
    int val;
    ListNode next;
    ListNode(int val) {
        this.val = val;
    }
}

public class ReverseNodesInKGroup {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null || k == 1) {
            return head;
        }
        // 创建一个虚拟头节点,方便处理
        ListNode dummy = new ListNode(0);
        dummy.next = head;

        ListNode prev = dummy;
        ListNode end = dummy;

        while (end.next != null) {
            // 找到当前组的最后一个节点
            for (int i = 0; i < k &amp;&amp; end != null; i++) {
                end = end.next;
            }
            if (end == null) {
                break;
            }
            ListNode start = prev.next;
            ListNode nextGroup = end.next;
            end.next = null;
            // 反转当前组的节点
            prev.next = reverseList(start);
            start.next = nextGroup;
            prev = start;
            end = start;
        }
        return dummy.next;
    }

    // 反转链表的方法
    private ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode current = head;
        while (current != null) {
            ListNode nextNode = current.next;
            current.next = prev;
            prev = current;
            current = nextNode;
        }
        return prev;
    }

    public static void main(String[] args) {
        // 创建链表 1->2->3->4->5->6->7
        ListNode head = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        ListNode node6 = new ListNode(6);
        ListNode node7 = new ListNode(7);

        head.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;
        node6.next = node7;

        ReverseNodesInKGroup solution = new ReverseNodesInKGroup();
        int k = 2;
        ListNode newHead = solution.reverseKGroup(head, k);

        // 打印反转后的链表
        while (newHead != null) {
            System.out.print(newHead.val);
            if (newHead.next != null) {
                System.out.print(&quot;->&quot;);
            }
            newHead = newHead.next;
        }
    }
}

```
全部评论
hard,面的字节?
点赞 回复 分享
发布于 03-14 18:52 上海

相关推荐

评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务