码迷,mamicode.com
首页 > 其他好文 > 详细

Rotate List leetcode

时间:2015-12-28 23:36:22      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

这个题很有意思,看题目可以想到利用循环链表,将链表构成一个环后,旋转一定角度后,然后再拆开环,就可以得到新的链表

这里需要注意的就是k值和链表长度的关系,我们可以将环看做钟表,链表长度n就是这个钟表的最大刻度,k值是指针走过的刻度,k值可以比n小,也可以比n大,因为钟表环形循环的特点,指针可能已经绕了钟表好几周,这几周可以完全省略掉,只取余数k % n就是指针走过的有效刻度。

我们如何得到新的头结点呢,联想到钟表,我们假设原来头结点在0刻度上,旋转后,原来 -k%n 刻度来到了0刻度的位置上,只要取链表头结点前面k%n个位置的结点就可以了,但是我们显然不能回退链表,这是个单链表,我们可以利用链表循环的特点,取之后 n - k % n 个位置。找到新的头结点后,我们再想办法找到它前面的节点就是新的尾结点。

思路清楚后,我不假思索,代码一气呵成,没有改动和debug直接贴到leetcode上就AC了,瞬间成就感爆棚啊!

ListNode* rotateRight(ListNode* head, int k) {
        if (head == nullptr)
            return head;
        ListNode *cur = head;
        int num = 1;
        while (cur->next != nullptr) {
            cur = cur->next;
            num++;
        }
        cur->next = head;
        int gap = num - k % num;
        ListNode *tail = nullptr;
        while (gap--) {
            tail = head;
            head = head->next;
        }
        tail->next = nullptr;
        return head;
    }

 

Rotate List leetcode

标签:

原文地址:http://www.cnblogs.com/sdlwlxf/p/5084269.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!