leetcode:单链表之Rotate List

leetcode:单链表之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->nullptr and k = 2, return 4->5->1->2->3->nullptr.

即:给出一个单链表,和一个K值,根据K值往右旋转。

分析这里的k可能是比链表长度要大的数字,因此实际旋转的位置通过k= len - k % len来获得;

输入

当k=1时,旋转后结果:

当k=2时,旋转后结果:

当k=3时,旋转后结果:

当k=4时,旋转后结果:

当k=5时,旋转后结果:

当k=6时,旋转后结果:

    ...

c++实现:

#include <iostream>

using namespace std;
struct ListNode
{
	int val;
	ListNode *next;
	ListNode (int x):val(x),next(NULL){ }
};
ListNode *createListNode(int arr[],int  n)
{
	ListNode *r;
	ListNode *p;
	ListNode * L=(ListNode*)malloc(sizeof(ListNode));
	
	r=L;
	
	for(int i=0;i<n;i++)
	{
		p=(ListNode*)malloc(sizeof(ListNode));
		p->val=arr[i];
		r->next=p;
		r=p;
	}
	r->next=NULL;

    return L->next;
}
ListNode *rotateRight(ListNode *head, int k)
{	
	if (head == NULL || k == 0) 
		return head;

    int len = 1;
    ListNode* p = head;
    while (p->next) // 求长度
	{ 
       len++;
       p = p->next;
    }
	k= len - k % len;
    p->next = head; // 首尾相连
    for(int step = 0; step < k; step++) 
	{
        p = p->next; //接着往后跑
    }
    head = p->next; // 新的首节点
    p->next = NULL; // 断开环
    return head;
}

int main()
{
	int a[]={1,2,3,4,5};

	ListNode *input;
	ListNode *out;
	int k=2;

	input= createListNode(a,5);
	
	out=rotateRight(input, k);
	while(out != NULL)
	{
        cout<<out->val;
        out = out->next;
    }
	cout<<endl;
	return 0;
}


测试结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值