题目描述
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
示例一:
输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3]
示例二:
输入:head = [0,1,2], k = 4 输出:[2,0,1]
题目分析
可以将原链表的尾节点指向头节点,这样就获得了一个环形链表。这时只需要获取旋转后链表的头节点与尾节点,将尾节点指向null。最后返回头节点即可。
为了完成以上操作,步骤如下:
1:首先获取链表的长度为length
2:K的值可能大于length,可能等于length,可能小于length。由于当K=length时链表相当于没有移动,所以链表移动的值为K%length
3:找链表的尾节点:不难得出,旋转后链表的尾节点就为原链表的第length-K%length个节点(节点从一开始数),这里称之为end。当end=0时,相当于K=0或者K=length,这时候无需任何操作,直接返会原来链表即可
4:将原链表的尾节点指向头节点,获取旋转后链表的头节点与尾节点,将尾节点指向null,返回头节点
java解法
**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(k == 0 || head == null || head.next == null) return head;
int length = 1;
ListNode node = head;
//获取链表的长度
while(node.next != null){
node = node.next;
length++;
}
//获取尾节点的参数
int end = length - k % length;
//K值为0或者K值为length
if(end == length){
return head;
}else{
//创造环形链表
node.next = head;
//得到旋转链表的尾节点
ListNode current = head;
for(int i = 1; i < end; i++){
current = current.next;
}
//得到旋转链表的头节点
ListNode pre = current.next;
//尾节点指向null
current.next = null;
//返回头节点
return pre;
}
}
}