Rotate List

Leetcode中链表的rotate问题

  这次我们来看看链表的rotate问题,先上题!
  https://leetcode.com/problems/rotate-list/

原题

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.
翻译:将一个链表向右旋转k步,比如给你链表:1->2->3->4->5->NULL并且k = 2,返回4->5->1->2->3->NULL。

问题分析

  可以发现,和数组的旋转不一样,其实链表大部分的结构并没有被破坏,说白了比如上面的例子,1->2->3和4->5的结构还是保存着的,然后只是这两个串的位置调换了而已。
  所以问题的关键是找到导数第k个元素,导数第k+1个元素,第一个元素,最后一个元素,然后:导数第k个元素->…->最后一个元素->第一个元素->…->导数第k+1个元素->NULL。
  这样就可以的啦。
  上代码:

public ListNode rotateRight(ListNode head, int k) 
{
    if(k == 0 || head == null)
    {
        return head;
    }

    ListNode theTemp = head;
    //先计算链表的长度
    int theLength = 0;
    while(theTemp != null)
    {
        ++theLength;
        theTemp = theTemp.next;
    }
    k = k%theLength;
    if(k == 0) return head;

    //找倒数第k,k+1个元素,就是slow.next和slow啦
    ListNode quickNode = head;
    ListNode slowNode = head;
    for(int i = 0; i < k; i++)
    {
        quickNode = quickNode.next;
    }
    while(quickNode.next != null)
    {
        quickNode = quickNode.next;
        slowNode = slowNode.next;
    }

    ListNode toReturn = slowNode.next;
    slowNode.next = null;
    quickNode.next = head;
    return toReturn;
}

  接下来我们顺便看看一个灰常有趣的image的rotate问题~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值