LeetCode Java First 400 题解-025

本文介绍了一种链表操作算法,通过翻转每K个节点来改变链表的结构,同时保持非整除部分不变。算法使用三个指针进行操作,确保了常数级的空间复杂度。

Reverse Nodes in k-Group    Hard

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

For example,
Given this linked list: 
1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

public ListNode reverseKGroup(ListNode head, int k) {

    if (head == null || head.next == null || k < 2) return head;

    ListNode dummy = new ListNode(0);

    dummy.next = head;

    ListNode tail = dummy, prev = dummy, temp;

    int count;

    while (true) {

        count = k;

        while (count > 0 && tail != null) {

            count--;

            tail = tail.next;

        }

        if (tail == null) break;

        head = prev.next;

        while (prev.next != tail) {

            temp = prev.next;//cache head

            prev.next = temp.next;//Delete head,这时指向第二结点

            temp.next = tail.next;//Point to after

            tail.next = temp;//put head at the end of the list



        }

        tail = head;

        prev = head;



    }

    return dummy.next;

}
思路:每次处理k个结点,三个指针,分别指头、尾和当前元素(temp),使用temp不断把头部元素移动到尾部(头尾分别向中间前进一位),直到头尾指到一处,再进行下一个k的处理。每次k结点的开头(pre)总是上k个的结尾结点,即未翻转时的头结点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值