NOTE

旋转链表

旋转链表的 LeetCode 解题笔记。

Data Structures & Algorithms创建于 更新于 约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 题目描述

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置

2. 思路

3. 实现

3.1. 快慢指针

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func rotateRight(head *ListNode, k int) *ListNode {
    if head == nil || head.Next == nil ||  k == 0 {return head}

    length := getLength(head)
    if k > length { k = k % length }
    if k == 0 {return head}

    dummyHead := &ListNode{Next:head}
    fast := dummyHead
    for i := 0; i < k; i++ {
        fast = fast.Next
    }
    slow := dummyHead
    for fast != nil && fast.Next != nil {
        fast = fast.Next
        slow = slow.Next
    }
    newHead := slow.Next
    slow.Next = nil
    fast.Next = dummyHead.Next
    return newHead
}


func getLength(head *ListNode) int {
    count := 0
    for head != nil {
        count++
        head = head.Next
    }
    return count
}

4. 参考

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看