zoukankan      html  css  js  c++  java
  • 乘风破浪: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    }

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

     

    三、总结

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

  • 相关阅读:
    oracle 与mysql 的当前时间比较
    easyui 时间定格为 时分
    date类型数据插入
    mac 获取idea&&datagrip激活码
    静态代码块
    nginx mac 下启动 停止 重启,查看安装位置
    定时任务的时间规则
    雅酷帮微信公众平台操作手册
    微信公众平台中通过网页增加好友
    微信公众平台消息接口开发之微信浏览器HTTP_USER_AGENT判断
  • 原文地址:https://www.cnblogs.com/zyrblog/p/10222056.html
Copyright © 2011-2022 走看看