单链表分组反转

题目描述

这其实是⼀道变形的链表反转题,⼤致描述如下 给定⼀个单链表的头节点 head,实现⼀ 个调整单链表的函数,使得每K个节点之间为⼀组进⾏逆序,并且从链表的尾部开始组 起,头部剩余节点数量不够⼀组的不需要逆序。(不能使⽤队列或者栈作为辅助) 例如: 链表: 1->2->3->4->5->6->7->8->null, K = 3 。那么 6->7->8 , 3->4->5 , 1->2 各 位⼀组。调整后: 1->2->5->4->3->8->7->6->null 。其中 1,2不调整,因为不够⼀ 组

参考文档

https://juejin.cn/post/6844903910386171912

解题思路

1、先写出一个方法,能够支持局部链表的逆序

func turnNode(node *Node, start, len int) {
    //先找到需要操作的位置
    a := node
    for i := 0; i < start-1; i++ {
        a = a.Next
    }
    b := a.Next
    c := b.Next
    //寻找len后面的节点
    d := a
    for i := 0; i < len; i++ {
        d = d.Next
    }
    b.Next = d.Next
    a.Next = d
    for i := 0; i < len-1; i++ {
        a = b
        b = c
        c = c.Next
        b.Next = a
    }
}

2.然后开始计算这个链表,从第几个位置开始逆序即可

func Test1(t *testing.T) {
    node := &Node{
        Value: 1,
        Next: &Node{
            Value: 2,
            Next: &Node{
                Value: 3,
                Next: &Node{
                    Value: 4,
                    Next: &Node{
                        Value: 5,
                        Next: &Node{
                            Value: 6,
                            Next: &Node{
                                Value: 7,
                                Next: &Node{
                                    Value: 8,
                                },
                            },
                        },
                    },
                },
            },
        },
    }
    // 计算需要翻转的位置
    var len int
    node2 := node
    for node2 != nil {
        len++
        node2 = node2.Next
    }
    k := 3
    y := len % k
    for i := 0; i < len/k; i++ {
        turnNode(node, i*k+y, k)
    }
    for node != nil {
        fmt.Println(node.Value)
        node = node.Next
    }
}

results matching ""

    No results matching ""