算法:旋转单向链表

题目:旋转链表

给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL```

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-list

分析

这道题很简单。首先让链表变成环,然后看哪个是头节点,把上个节点的next指针变成null,返回该头节点即可。怎么找到头节点呢?用链表的长度-用k取链表长度模,就是头节点了。

解答

fun rotateRight(head: ListNode?, k: Int): ListNode? {
    if (head?.next == null) return head

    var num = 0
    var current = head
    var previous : ListNode? = head
    while (previous?.next!=null){
        num++
        previous = previous.next
    }
    num++
    previous?.next = current
    val step = num-k%num
    for (i in 1..step){
        previous = current
        current = current?.next
    }
    previous?.next = null
    return current
}

复杂度分析

时间复杂度

遍历一次链表

  • 时间复杂度:O(n)
空件复杂度

常量空间

  • 空间复杂度:O(1)

你可能感兴趣的:(算法,链表,算法,leetcode,数据结构)