leetCode61.旋转链表

题目

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
在这里插入图片描述

coding

/**
 * 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(head == null){
            return null;
        }
        ListNode cur = head;
        // 记录链表的长度
        int count = 1;
        // 找到最后一个
        while(cur.next != null){
            cur = cur.next;
            count ++;
        }
        // 构成环
        cur.next = head;
        // 循环到指定的点将其断开(因为k可能大于n,所以需要%)
        for(int i = 0; i < count - k % count; i++){
            cur = cur.next;
        }

        head = cur.next;
        cur.next = null; 
        return head;

    }
}

总结

  1. 思路很巧妙
    1. 先将链表构成环,然后在指定的位置将键断开即可
  2. 难点:
    1. 断键的位置,因为我们代码是将最后的指针指向原始链表的最后的位置,所以我们的目标是总的链表长度-k
    2. 由于题目中的k是会大于我们的链表长度的所以需要对总长度取模
  3. 步骤总结图
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值