旋转链表
题目描述
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例1
复制代码
1
2
3
4
5
6输入: 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
复制代码
1
2
3
4
5
6
7
8输入: 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
算法解析
-
判断,若head.next = 0 或 k=0 , return head;
-
计算链表的长度len,并判断,若k%len == 0,return head;
-
若k%len != 0, 另k = k%len;定义两个指针l,r 构成快慢指针;
-
先让r先走k次,在l、r同步前进,直到r.next = null结束;
-
对l处进行断链,使得ListNode nh = l.next;
-
使得l.next = null , r.next = temp;
-
返回 return nh;
代码实现:
复制代码
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/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode rotateRight(ListNode head, int k) { if(head == null || k==0) return head; int len = 0; ListNode temp = head; while(temp!=null) { len++; temp = temp.next; } if(k%len ==0) return head; k = k%len; temp = head; ListNode l = head; ListNode r = head; while(k>0){ r = r.next; k--; } while(r.next!=null){ l = l.next; r = r.next; } ListNode nh = l.next; l.next = null; r.next = temp; return nh; } }
最后
以上就是花痴滑板最近收集整理的关于Java leetcode 旋转链表的全部内容,更多相关Java内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复