首页 > 试题广场 >

旋转链表

[编程题]旋转链表
  • 热度指数:5316 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定链表的头节点,旋转链表,将链表每个节点往右移动 k 个位置,原链表后 k 个位置的节点则依次移动到链表头。

即,例如链表 : 1->2->3->4->5 k=2 则返回链表 4->5->1->2->3

数据范围:链表中节点数满足
示例1

输入

{1,2,3,4,5},2

输出

{4,5,1,2,3}
示例2

输入

{1,2,3},3

输出

{1,2,3}

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
/**
 *  #[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!();
    }
}

发表于 2024-08-15 23:00:31 回复(0)