leetcode 25. k個一組翻轉鏈表

題目描述

給出一個鏈表,每 k 個節點一組進行翻轉,並返回翻轉後的鏈表。node

k 是一個正整數,它的值小於或等於鏈表的長度。若是節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。git

示例:github

給定這個鏈表:1->2->3->4->5

當 k = 2 時,應當返回: 2->1->4->3->5

當 k = 3 時,應當返回: 3->2->1->4->5

說明:golang

  • 你的算法只能使用常數的額外空間。
  • 你不能只是單純的改變節點內部的值,而是須要實際的進行節點交換。

解題思路

1. 取鏈表的前K個節點,若是夠K個節點,就截斷後進行反轉,不夠K個節點,說明處理完了,return
2. 反轉完前K個節點後,使用遞歸,處理後面的鏈表

代碼實現

// ListNode Definition for singly-linked list.
type ListNode struct {
    Val  int
    Next *ListNode
}

func reverseKGroup(head *ListNode, k int) *ListNode {
    if k < 2 || head == nil || head.Next == nil {
        return head
    }

    tail, needReverse := getTail(head, k)

    if needReverse {
        tailNext := tail.Next
        //斬斷 tail 後的連接
        tail.Next = nil
        head, tail = reverse(head, tail)

        //tail 後面接上尾部的遞歸處理
        tail.Next = reverseKGroup(tailNext, k)
    }

    return head
}

func getTail(head *ListNode, k int) (*ListNode, bool) {
    for k > 1 && head != nil {
        head = head.Next
        k--
    }
    return head, k == 1 && head != nil
}

func reverse(head, tail *ListNode) (*ListNode, *ListNode) {
    //反轉鏈表
    prev, cur := head, head.Next
    for cur != nil {
        prev, cur, cur.Next = cur, cur.Next, prev
    }
    return tail, head
}

GitHub

  • 源碼傳送門
  • 項目中會提供各類數據結構及算法的Golang實現, LeetCode解題思路及答案
題目來源

leetcode 25. k個一組翻轉鏈表算法

相關文章
相關標籤/搜索