• 乘风破浪: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    }

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

     

    三、总结

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

  • 相关阅读:
    12.C语言控制窗口
    11.字符,字符常见开发,_itoa函数
    Clusterware 和 RAC 中的域名解析的配置校验和检查 (文档 ID 1945838.1)
    导致实例逐出的五大问题 (文档 ID 1526186.1)
    如何诊断 11.2 集群节点驱逐问题 (文档 ID 1674872.1)
    11gR2新特性---Gpnp守护进程
    CSS 功能简介
    11gR2新特性---gipc守护进程
    10g集群启动顺序
    11gR2集群件任务角色分离(Job Role Separation)简介
  • 原文地址:https://www.cnblogs.com/zyrblog/p/10222056.html
Copyright © 2020-2023  润新知