我是靠谱客的博主 无语画笔,这篇文章主要介绍Leetcode61. 旋转链表题目,现在分享给大家,希望可以做个参考。

题目

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
在这里插入图片描述
思路:题目很短,但是通过例子不难发现,k是指旋转的次数,但同时也能发现,如果我们将此时的链表当成一个循环链表,那么原来倒数第K个节点就是我们想要的头节点。但同时还要注意一点,这个K是有可能超过链表长度的,而超出的部分其实是在做无用功,比如链表长度是2,K=5,旋转5次,但是通过发现不难得出,旋转5次和旋转1次的结果相同,即我们对k取余,除数是length(链表长度)。最后我们回归到求倒数第K个节点这个问题上即可,通过快慢指针来找到倒数第k个节点,具体细节看代码。

复制代码
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
public class Leetcode61 { public ListNode rotateRight(ListNode head, int k) { // 如果链表为空 或者 只有一个节点 说明不用旋转 if(head == null || head.next == null){return head;} // length表示链表长度 int length = 1; ListNode temp = head; while(temp.next!=null){ temp = temp.next; length++; } // 更新K k = k % length; // 如果更新完的K等于0,说明不用旋转 if(k == 0){return head;} // 快慢 指针 找 倒数第k个节点作为头节点 ListNode fast = head; ListNode slow = head; while(k!=0){ fast = fast.next; k--; } // 找倒数第K个节点的前一个 while(fast.next!=null){ fast = fast.next; slow = slow.next; } // 保存节点信息并切断 ListNode begin = slow.next; ListNode result = begin; slow.next = null; // 遍历后半段 while(begin.next!=null){ begin = begin.next; } // 连接 begin.next = head; return result; } }

在这里插入图片描述
为了获取长度,我们遍历了一次链表,即O(n),为了找到快慢指针,快指针 走了 O(n),慢指针为O(n-k),拼接的时候遍历了O(k),所以整个时间复杂度为O(3n),即O(n)。

最后

以上就是无语画笔最近收集整理的关于Leetcode61. 旋转链表题目的全部内容,更多相关Leetcode61.内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部