zoukankan      html  css  js  c++  java
  • 链表翻转(按K个一组)(Go语言)

    题目描述

    题目:链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6
     
    例如:
    给定的链表是1 o2 o3 o4 o512345
    对于  k = 2 k=2, 你应该返回 2 o 1 o 4 o 3 o 521435
    对于  k = 3 k=3, 你应该返回 3 o2 o1 o 4 o 532145

     

            把整个链表按照每K个一组分成若干组。递归翻转,先翻转最后一组,依次向前翻转。

           不好理解的地方在于,每一组翻转后怎么衔接。其实跳出递归后,表示后面的节点已经完成了翻转,只需要把这一组原来的头结点的next指向后面的节点就完成了组之间的衔接。可以把后面的节点想象成一个节点。

    package main
    import . "nc_tools"
    /*
     * type ListNode struct{
     *   Val int
     *   Next *ListNode
     * }
     */
    
    /**
      * 
      * @param head ListNode类 
      * @param k int整型 
      * @return ListNode类
    */
    func reverseKGroup( head *ListNode ,  k int ) *ListNode {
        // write code here
        if head == nil || k<=1{
            return head
        }
        var count int = 0
        nextHead := head
        for nextHead!=nil && count<k{
            nextHead = nextHead.Next
            count++
        }
        if count == k{
            nextHead := reverseKGroup(nextHead, k)
            for count > 0{
                count--
                /*保存修改之前的pNext*/
    	    /*!!在这个循环中nextHead复用,第一次循环用于链接两个组
    	       之后可以当做pPre,即修改链表之前的上一个节点!!*/
                headNext := head.Next
                head.Next = nextHead
                nextHead = head
                head = headNext
            }
            head = nextHead
        }
        return head
    }
    

      

  • 相关阅读:
    POJ 3140 Contestants Division (树形DP,简单)
    POJ 2378 Tree Cutting (树的重心,微变形)
    js数据类型--对象&数组
    关于JS call apply 对象、对象实例、prototype、Constructor、__proto__
    JS模块化编程(四)--require应用
    JS模块化编程(三)
    利用VS正则替换删除文本行首数据等字符
    JS模块化编程(二)
    JS模块化编程(一)
    js继承
  • 原文地址:https://www.cnblogs.com/lvpengbo/p/14408637.html
Copyright © 2011-2022 走看看