题目
给定一个链表,旋转链表,将链表每个节点向右移动 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 := 0node := headfor node != nil {length += 1node = node.Next}for i := 0; i < k % length; i++ {head = rotateOne(head)}return head}func rotateOne(head *ListNode) *ListNode {node := headvar prev *ListNodefor node.Next != nil {prev = nodenode = node.Next}prev.Next = nilnode.Next = headreturn 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}// 找到最小的klength := 0node := headfor node != nil {length += 1node = node.Next}k = k % lengthif k == 0 {return head}// 双指针firstPtr := headsecondPtr := headi := 0for firstPtr.Next != nil {firstPtr = firstPtr.Nexti += 1if i > k {secondPtr = secondPtr.Next}}new_head := secondPtr.NextsecondPtr.Next = nilfirstPtr.Next = headreturn 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 = nillist[len(list) - 1].Next = list[0]return new_head}
- 时间复杂度
- 空间复杂度
- 参考 leetcode 答案得出上述方案
原文
https://leetcode-cn.com/explore/learn/card/linked-list/197/conclusion/767/
