leetcode hot150第61题旋转链表

题目:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

和之前的数组转换一样,先求出k mod n,只关注余数因为不管循环了多少次都是相同的链表。

首先求出链表长度,先定一一个节点,因为这个节点会移到最后,所以正好用他来连接头节点形成环。

为什么要形成环?因为新链表的最后一个节点是原链表的第 (n-1) - (k%n)个节点。

要明白,连成环之后,从最后一个节点移动s步就对应着k = n-s 。

即在最后一个节点移动s步之后切断链表。

(当然也可以使用和数组反转一样的思路:1、全反转。2、前k反转。3、后n-k反转)

可以想成为:把后k个节点截下来连到链表头

public class no_61 {
    public static void main(String[] args) {
        ListNode l = new ListNode(1, new ListNode(2, new ListNode(3,
                new ListNode(4, new ListNode(5)))));

        ListNode re = rotateRight(l, 2);
        while (re != null) {
            System.out.println(re.val);
            re = re.next;
        }
    }

    public static ListNode rotateRight(ListNode head, int k) {
        if (k == 0 || head == null || head.next == null) {
            return head;
        }
        ListNode dummyNode = head;
        int n = 1;
        while (dummyNode.next != null) {
            dummyNode = dummyNode.next;
            n += 1;
        }
        int add = n - k % n;
        if (add == n) {
            return head;
        }
        dummyNode.next = head;
        while (add-- > 0) {
            dummyNode = dummyNode.next;
        }
        ListNode re = dummyNode.next;
        dummyNode.next = null;

        return re;
    }
}

根据情况自己调整吧!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值