0%

LeetCode.K个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

  • 示例:
    给你这个链表:1->2->3->4->5
    当 k = 2 时,应当返回: 2->1->4->3->5
    当 k = 3 时,应当返回: 3->2->1->4->5

    解法:

    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
    43
    44
    45
    46
    47
    48
    49
    object KReverseLinkedList {

    def main(args: Array[String]): Unit = {
    println(reverseK(ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5, ListNode(6, null)))))), 2))
    println(reverseK(ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5, null))))), 2))
    println(reverseK(ListNode(1, ListNode(2, ListNode(3, ListNode(4, null)))), 3))
    }

    def reverseK(node: ListNode, k: Int): ListNode = {
    var start = node
    var end = node
    for (i <- 0 until k - 1) {
    if (end.next == null) {
    return node
    } else {
    end = end.next
    }
    }

    start = end.next
    end.next = null
    val rev = reverse(node)

    var cur = rev
    while (cur.next != null) {
    cur = cur.next
    }

    if (start != null) {
    cur.next = reverseK(start, k)
    }
    rev
    }

    def reverse(node: ListNode): ListNode = {
    if(node == null || node.next == null){
    node
    }else{
    val newNode = reverse(node.next)
    node.next.next = node
    node.next = null
    newNode
    }
    }

    case class ListNode(value: Int, var next: ListNode)

    }