题目
给定一个链表,旋转链表,将链表每个节点向右移动 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
示例 2:
输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL
方案一
/**
* 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 {
return head
}
length := 0
node := head
for node != nil {
length += 1
node = node.Next
}
for i := 0; i < k % length; i++ {
head = rotateOne(head)
}
return head
}
func rotateOne(head *ListNode) *ListNode {
node := head
var prev *ListNode
for node.Next != nil {
prev = node
node = node.Next
}
prev.Next = nil
node.Next = head
return node
}
- 时间复杂度
方案二(双指针)
/**
* 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 {
return head
}
// 找到最小的k
length := 0
node := head
for node != nil {
length += 1
node = node.Next
}
k = k % length
if k == 0 {
return head
}
// 双指针
firstPtr := head
secondPtr := head
i := 0
for firstPtr.Next != nil {
firstPtr = firstPtr.Next
i += 1
if i > k {
secondPtr = secondPtr.Next
}
}
new_head := secondPtr.Next
secondPtr.Next = nil
firstPtr.Next = head
return new_head
}
- 时间复杂度 ;
- 空间复杂度
- 第一次使用快慢指针得到链表的长度;
- 第二次使用窗口大小为 的双指针;
- 找到节点后翻转即可。
方案三(双指针+数组)
/**
* 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 {
return head
}
list := []*ListNode{}
for head != nil {
list = append(list, head)
head = head.Next
}
k = k % len(list)
if k == 0 {
return list[0]
}
new_head := list[len(list) - k]
list[len(list) - k - 1].Next = nil
list[len(list) - 1].Next = list[0]
return new_head
}
- 时间复杂度
- 空间复杂度
- 参考 leetcode 答案得出上述方案
原文
https://leetcode-cn.com/explore/learn/card/linked-list/197/conclusion/767/