【力扣】旋转链表

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

 

解了几次要么是有的情况没考虑到,要么是力扣网给的例子都极端了,都出错了。下面说说我一开始的思路:

最开始的思路挺简单的,就是获取到链表的最后的结点,接k次接到链表表头,比如123 两次

那么就是获得链表尾,接到表头3->1->2

第二次:2->3->1

但是我用到了两个循环,不出所料 最后超出时间限制了 = =

代码如下:

//旋转链表
    public static ListNode rotateRight(ListNode head, int k) {
        if (head==null)return null;
        if(head.next==null) return head;
        while(k>0){
            ListNode p = new ListNode();
            ListNode q = head;
            for(int i=1;i<length(q)-1;i++){
                head = head.next;
            }
            p.val = head.next.val;// 1 2 3 4 5  51234
            head.next = null;
            p.next = q;
            head = p;
            k--;
        }
        return head;
    }
//求链表长度
    public static int length(ListNode listNode){
        int length=0;
        while(listNode!=null){
            length++;
            listNode = listNode.next;
        }
        return length;
    }

总思路就是刚刚说的, 先新建结点q  = head;循环让head指向链表倒数第二个,例子1->2->3的2,然后新建结点p,把head.next的值赋给p(也就是2),然后让3指向null,p(3)指向q(也就是最开始的表头1)即(3->1->2),head再回到新表表头进行下一个循环,直到k等于0

看了评论区发现了另一个思路

大概是说收尾相连,找到原链表第(length-k)结点,它的下一个就是新链表的头结点

 //旋转链表
    public static ListNode rotateRight2(ListNode head, int k) {
        if(head ==null||head.next==null||k==0) return head;
        ListNode q = head;
        int length =0;
        //指针指向链表末尾
        while(head!=null){
            length++;
            head = head.next;
        }
        k %= length;
        //如果k为0不需要旋转
        if(k==0)return head;
        //收尾相连
        head.next = q;
        for(int i=1;i<length-k;i++){
            q = q.next;
        }
        ListNode p = q.next;
        q.next =null;
        return p;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值