链表翻转(按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\to2\to3\to4\to512345
对于 \ k = 2 k=2, 你应该返回 2\to 1\to 4\to 3\to 521435
对于 \ k = 3 k=3, 你应该返回 3\to2 \to1 \to 4\to 532145

 

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

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

copy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
}

  

posted @   布尔先生  阅读(181)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起