乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group

Posted 精心出精品

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group相关的知识,希望对你有一定的参考价值。

乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group

一、前言

      将一个链表按照一定的长度切成几部分,然后每部分进行翻转以后再拼接成一个链表是比较困难的,但是这也能锻炼我们的思维能力。

二、Reverse Nodes in k-Group

2.1 问题

2.2 分析与解决

    最简单的想法,我们可以将链表分成几部分,每一个部分分开考虑,比如使用头插法,正好可以将顺序颠倒一下,或者我们通过某种方式使得顺序发生改变,然后再结合起来。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {

        ListNode dom = new ListNode(0);
        dom.next = head;
        ListNode tmp = head;
        int size = 0;

        //获取队列长度
        //get list size
        while (tmp != null) {
            tmp = tmp.next;
            size++;
        }

        //如果长度不够,则直接返回
        if (size < k) return head;

        //切割数组,并转换
        //split list, and reverse sub list
        int position = 0;
        ListNode pre = dom;
        ListNode rHead = null;
        ListNode rTail = null;
        ListNode next = null;
        for (int count = 0; (count + 1) * k <= size; count++) {

            position = 0;

            rHead = null;
            rTail = null;
            tmp = pre.next;
            //翻转子队列
            //reverse sub list
            while (position < k) {

                next = tmp.next;

                if (rTail == null) {
                    rHead = tmp;
                    rTail = tmp;
                } else {
                    tmp.next = rHead;
                    rHead = tmp;
                }

                tmp = next;
                position++;
            }

            if (rHead != null) {
                pre.next = rHead;//这一步第一次就将头指针赋值给了dom.next,这样完成了衔接和搭配
                rTail.next = tmp;
                pre = rTail;
            }
        }

        return dom.next;
    }
}

      在我们的程序中,如下面的代码其实就是头插法的实现。

1    if (rTail == null) {
2          rHead = tmp;
3          rTail = tmp;
4    } else {
5          tmp.next = rHead;
6          rHead = tmp;
7    }

     通过上面的图,我们可以更加清楚地明白程序的内容。

 

三、总结

    在处理这样的问题的时候,我们一定要画图,通过图中指针的变化,我们可以很容易、很准确的写出代码。另外也要注意头插法对于链表排序的作用,当然尾插法也是我们最常用的方式。

以上是关于乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group的主要内容,如果未能解决你的问题,请参考以下文章

乘风破浪:LeetCode真题_031_Next Permutation

乘风破浪:LeetCode真题_027_Remove Element

乘风破浪:LeetCode真题_007_Reverse Integer

乘风破浪:LeetCode真题_035_Search Insert Position

乘风破浪:LeetCode真题_040_Combination Sum II

乘风破浪:LeetCode真题_038_Count and Say