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

leetcode_61_Rotate List

时间:2015-02-15 10:48:19      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢技术分享


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可能非常大,比链表的长度大得多,但是因为是循环右移,所以实际上只要循环右移K%Length位(Length为链表长度)。



//没理解好题意,写成了将右边k个数字移到前面,但是也能通过
//注意一点,K可能非常大,比链表的长度大得多,但是因为是循环右移,所以实际上只要循环右移K%Length位(Length为链表长度)。
class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if(head==NULL)
            return head;
		int len = getlistlen(head);
		k = k%len;
		int n = len - k;
		if(k==0)
			return head;
		ListNode *first=head;
		for(int i=0; i<n-1; i++)
		{
			first = first->next;
		}
		ListNode *head2 = first->next;
		first->next = NULL;
		ListNode *second = head2;
		for(int i=0; i<k-1; i++)
		{
			second = second->next;
		}
		second->next = head;

		return head2;
    }
private:
	int getlistlen( ListNode *head)
	{
		int len=0;
		while(head)
		{
			len++;
			head = head->next;
		}
		return len;
	}
};



//另一种写法
class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if (head == NULL || head->next == NULL || k == 0) {
            return head;
        }
        
        int length = 0;
        ListNode *ptr = head, *tail = head;
        while (ptr != NULL) {
            length++;
            tail = ptr;
            ptr = ptr->next; 
        }
        k %= length;
        
        ptr = head;
        for (int i = 0; i < length - k - 1; i++) {
            ptr = ptr-> next;
        }
        
        tail->next = head;
        head = ptr->next;
        ptr->next = NULL;
        
        return head;
    }
};



#include<iostream>

using namespace std;

#define N 5

struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};

//没理解好题意,写成了将右边k个数字移到前面,但是也能通过
class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if(head==NULL)
            return head;
		int len = getlistlen(head);
		k = k%len;
		int n = len - k;
		if(k==0)
			return head;
		ListNode *first=head;
		for(int i=0; i<n-1; i++)
		{
			first = first->next;
		}
		ListNode *head2 = first->next;
		first->next = NULL;
		ListNode *second = head2;
		for(int i=0; i<k-1; i++)
		{
			second = second->next;
		}
		second->next = head;

		return head2;
    }
private:
	int getlistlen( ListNode *head)
	{
		int len=0;
		while(head)
		{
			len++;
			head = head->next;
		}
		return len;
	}
};

ListNode *creatlist()
{
	ListNode *head = NULL;
	ListNode *p;
	for(int i=0; i<N; i++)
	{
		int a;
		cin>>a;
		p = (ListNode*) malloc(sizeof(ListNode));
		p->val = a;
		p->next = head;
		head = p;
	}
	return head;
}

int main()
{
	ListNode *list = creatlist();
	Solution lin;
	int a;
	cin>>a;
	ListNode *outlist = lin.rotateRight ( list,a );
	for(int i=0; i<N; i++)
	{
		cout<<outlist->val;
		outlist = outlist->next;
	}
}




leetcode_61_Rotate List

标签:

原文地址:http://blog.csdn.net/keyyuanxin/article/details/43833381

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