Leetocde : Rotate List

题目连接:https://leetcode.com/problems/rotate-list/#/description

题目大意:

Given a list, rotate the list to the right by k places, where k is non-negative.

For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.

解题思路:

类似的链表题目很多,有时间还是要整理一下,今天就是只是针对这个题给出解题思路。

  • 首先对链表进行遍历,遍历的目的有两个,第一就是获得链表有多少个节点;第二就是获得链表的结尾节点(也就是null的前一个节点)。
  • 然后进行链表的尾-首连接,也就是末尾节点的next指向head节点。
  • 第一次遍历已知链表的总共节点数 total,那么total-k便是链表左半部分的节点数left;
  • 从head开始找left个节点这样就找到了反转后新的尾节点,也就找到了新的head节点,则该问题解决。
注意 :可能存在total - k =0的情况,所以为了统一处理我把第一次遍历我把head指向了尾节点,这样如果是total-k==0的情况,正好把head往后移动一个节点。

下面给出代码:

public class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head==null) return head;
        int total =1;
        ListNode p=head,rear;
        while(p.next!=null){
            total++;
            p=p.next;
        }
        p.next = head;
        head = p;

        if(k>total)
            k=k%total;
        int left = total-k;
        p = head;
            while(left>0){
                left--;
                p=p.next;
            }
            rear = p;
            head = rear.next;
        rear.next=null;
        return head;
    }
}

运行结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值