链表翻转(按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
}

  

原文地址:https://www.cnblogs.com/lvpengbo/p/14408637.html