题目描述
牛客链接:
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e?tpId=117&&tqId=34971&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
解题思路:
先遍历链表,得出链表节点个数
然后用两层循环,第一层控制翻转的次数,第二层控制在一定区间内的链表节点全部翻转
用两个变量来分别记录链表翻转的头尾节点
代码
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
}
//遍历链表,计算链表节点个数,并计算需要翻转次数
count := 0
cnt := 0
temp := head
for temp!=nil {
temp = temp.Next
count++
}
if count<k {
return head
}
cnt = count/k
//进行链表翻转
var pre *ListNode = nil
temp = head
last := temp //记录翻转的第一个节点
var last1 *ListNode = nil //记录翻转的最后一个节点
for i:=0; i<cnt; i++ {
num := 0
last = temp
pre = nil
for num<k {
next := temp.Next
temp.Next = pre
pre = temp
temp = next
num++
}
if last1!=nil {
last1.Next = pre
}
if i==0 {
head = pre
}
last1 = last
}
if temp!=nil {
last.Next = temp
}
return head
}
注意:
链表翻转
记录翻转的头尾节点