【LeetCode】61. Rotate List

61. 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.

解答

这道题主要考察一个技巧的运用。快慢指针。

拿示例来进行举例,对于链表1->2->3->4->5->NULL and k = 2。起初快慢指针均指向头结点,我们让快指针先走 k 步,此时块指针指向3,慢指针仍指向1,然后快慢指针同时不断往前走直到快指针到达最后一个元素,即有此时快指针指向5,慢指针指向3。

此时慢指针所指元素,应该是整个链表右移k个位置之后的尾元素。而其后的元素应该是在原来的头结点之前,此时我们只需要更快慢指针中的next值,然后返回新的头结点即可。

“`cpp
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k)
{
//边界条件检查
if(!head || k == 0) return head;

    //计算链表长度
    int count = 0;
    ListNode *cur = head;
    while(cur) 
    {
        ++count;
        cur = cur->next;
    }

    //取模,检查是否需要旋转
    int num = k%count;
    if(num == 0)    return head;

    //快慢指针,快指针先走num步
    ListNode *fast = head, *slow = head;
    while(num-- > 0)    fast = fast->next;

    //快慢指针一起走,直到快指针到达链表中最后一个结点
    while(fast->next)
    {
        fast = fast->next;
        slow = slow->next;
    }

    //旋转,慢指针所指的元素变为最后一个元素,慢指针后的元素变为新的头指针,快指针所指结点和原来的头结点连接在一起
    ListNode *newHead = slow->next;
    slow->next = nullptr;
    fast->next = head;
    return newHead;
}

};
“`r

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值