给定链表的头节点,旋转链表,将链表每个节点往右移动 k 个位置,原链表后 k 个位置的节点则依次移动到链表头。
即,例如链表 : 1->2->3->4->5 k=2 则返回链表 4->5->1->2->3
数据范围:链表中节点数满足
, 
/**
* #[derive(PartialEq, Eq, Debug, Clone)]
* pub struct ListNode {
* pub val: i32,
* pub next: Option<Box<ListNode>>
* }
*
* impl ListNode {
* #[inline]
* fn new(val: i32) -> Self {
* ListNode {
* val: val,
* next: None,
* }
* }
* }
*/
struct Solution{
}
impl Solution {
fn new() -> Self {
Solution{}
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
pub fn rotateLinkedList(&self, mut head: Option<Box<ListNode>>, k: i32) -> Option<Box<ListNode>> {
// write code here
if head.is_none() {return head}
let mut len = 0;
let mut p = &head;
while p.is_some() {
p = &p.as_ref().unwrap().next;
len += 1;
}
let mut skip = len - (k % len);
if (k % len) == 0 {return head}
drop(p);
let mut p = &mut head;
for _ in 1..skip {
p = &mut p.as_mut().unwrap().next;
}
let mut newhead = p.as_mut().unwrap().next.take();
drop(p);
let mut p = &mut newhead;
while p.as_mut().unwrap().next.is_some() {
p = &mut p.as_mut().unwrap().next;
}
p.as_mut().unwrap().next = head;
newhead
// todo!();
}
}