首页 > 其他 > 详细

leetcode:Rotate List

时间:2015-03-23 23:52:26      阅读:299      评论:0      收藏:0      [点我收藏+]

一、 题目

给出一个链表,将右边k个节点移到前面。

例如:1->2->3->4->5->NULLk = 2

返回  4->5->1->2->3->NULL

二、 分析

之前我们遇到过将字符右移或左移的,当时的思路是将前一部分反转,后一部分反转,整体再反转,即可得到结果。

不过这道题我们需要换一种思路,其实对于这种链表的问题,我们可以总结出,链表的反转都可以直接从某一个位置开始截断即可,例如上面的这道题:

1h = head,将指针h移到最后一个非空节点,即5的位置p

2p->next = head,此时形成了一个环,不过这个环只是我们的工具,我们要找到合适的位置截断

3、继续将指针向前移动len-k个,在此截断,返回后一个节点即可

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if(head == NULL || k == 0)
            return head;
        int len = 1;
        ListNode *h;
        h = head;
        while(head->next != NULL){
            head = head->next;
            len++;
        }
        k = k%len;
        if(k == 0)
            return h;
        else {
            head->next = h;
            k = len - k;
            while(k--){
                head = head->next;
            }
            h = head->next;
            head->next = NULL;
            head = h;
        }
        return head;
    }
};


 

 

leetcode:Rotate List

原文:http://blog.csdn.net/zzucsliang/article/details/44573499

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!