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
    }
    

      

  • 相关阅读:
    win7桌面的文件路径是否可以更改
    win10怎么更新flash到最新版本【系统天地】
    centos7 lnmp环境部署
    thinkphp5 部署注意事项
    linux下导入、导出mysql数据库命令的实现方法
    Centos7 系统下怎么更改apache默认网站目录
    centos7 配置lamp 环境
    Redis笔记(4)独立功能的实现
    Redis笔记(3)多数据库实现
    Redis笔记(2)单机数据库实现
  • 原文地址:https://www.cnblogs.com/lvpengbo/p/14408637.html
Copyright © 2011-2022 走看看