描述
给定链表的头节点,旋转链表,将链表每个节点往右移动 k 个位置,原链表后 k 个位置的节点则依次移动到链表头。
即,例如链表 : 1->2->3->4->5 k=2 则返回链表 4->5->1->2->3
数据范围:链表中节点数满足 0≤n≤1000 , 0≤k≤10 ^9
示例1
输入:
{1,2,3,4,5},2
返回值:
{4,5,1,2,3}
示例2
输入:
{1,2,3},3
返回值:
{1,2,3}
保存所有值,转成数组,然后再存入链表中
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode rotateLinkedList (ListNode head, int k) {
// write code here
// 转成数组,移动
ArrayList<Integer> value = new ArrayList<>();
while (head != null) {
value.add(head.val);
head = head.next;
}
int temp[] = new int[value.size()];
for (int i = 0; i < value.size(); i++) {
temp[(i + k) % value.size()] = value.get(i);
}
ListNode result = new ListNode(-1);
ListNode pre = result;
for (int i = 0; i < temp.length; i++) {
pre.next = new ListNode(temp[i]);
pre = pre.next;
}
return result.next;
}
}
先闭合整个链表并得出长度;
找到断链首节点;
断链首节点为头节点,由于闭合以后末尾节点与第一个相连,所以形成转换;
返回断链首节点
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode rotateLinkedList (ListNode head, int k) {
// write code here
// 转成数组,移动
if(head == null)
return null;
int len = 1;
// 求出链表长度
ListNode temp = head;
while(temp.next !=null)
{
len++;
temp = temp.next;
}
//旋转后链表的首节点
int p = len - k % len;
temp.next = head;
//找到首节点
while(p>0){
temp = temp.next;
p--;
}
//断链
ListNode res = temp.next;
temp.next = null;
return res;
}
}