图片.png

栈实现

  1. func reverseKGroup(head *ListNode, k int) *ListNode {
  2. dummy := &ListNode{Val: -1,}
  3. dummy.Next = head
  4. pre :=dummy
  5. stack := make([]*ListNode,0)
  6. n := k
  7. for pre.Next!=nil{
  8. tmp :=pre.Next
  9. for tmp!= nil&&n>0{
  10. stack = append(stack,tmp)
  11. tmp = tmp.Next
  12. n--
  13. }
  14. topNode := stack[len(stack)-1]
  15. nextNode :=topNode.Next
  16. if n==0{
  17. for len(stack)>0{
  18. topNode :=stack[len(stack)-1]
  19. stack = stack[:len(stack)-1]
  20. pre.Next = topNode
  21. pre = pre.Next
  22. }
  23. pre.Next = nextNode
  24. n = k
  25. }else {
  26. return dummy.Next
  27. }
  28. }
  29. return dummy.Next
  30. }

图片.png

或者链表反转

func revert(head *ListNode)*ListNode{
    var pre *ListNode
    curr := head
    for curr!= nil{
        pre,curr,curr.Next = curr,curr.Next,pre
    }
    return pre
}

func reverseKGroup(head *ListNode, k int) *ListNode {
    dummy := &ListNode{Val:  -1,}
    dummy.Next = head
    pre,curr,end := dummy,dummy,dummy
    for end!=nil{
        // 获取当前节点
        curr = pre.Next
        // 获取结束结点
        for i:=0;i<k;i++{
            end = end.Next
            if end == nil{
                return dummy.Next
            }
        }
        // 暂存后节点
        next := end.Next
        end.Next = nil// 至空
        pre.Next = revert(curr)
        // 反转结束后当前子链表的头结点
        pre,end = curr,curr// 都是当前值
        curr.Next = next//需要把链表串起来
    }
    return dummy.Next
}