题目描述
题目:链表翻转。给出一个链表和一个数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 o51→2→3→4→5
对于 k = 2 k=2, 你应该返回 2 o 1 o 4 o 3 o 52→1→4→3→5
对于 k = 3 k=3, 你应该返回 3 o2 o1 o 4 o 53→2→1→4→5
把整个链表按照每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
}