LeetCode61Rotate 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、先遍历整个链表求出总长度length

2、根据k求出链表的新的head在什么位置,length-k的位置

3、假如p指向length-k-1的地方,head=p.next,然后将p.next=null,因为它要作为链表的结尾

3、然后从新的head节点遍历到末尾,链接到初始head节点的位置。

出错的地方:题目中k的值可以大于链表的长度。那要怎么解决呢?实际上当k值大于链表长度时,旋转k次的结果等于k%length后的结果。我们在这稍加判断即可。

if (head == null)
			return null;
		int length=1;
		int i = 1;
		ListNode p = head;
		ListNode q = head;
		while(p.next!=null)
		{
			p=p.next;
			length++;
		}
		p=head;
		if(n>length)n=(n%length);
		int k=length-n;
		if(k==0)return head;
		while (p.next != null)
		{
			if (i > k-1)
				break;
			p = p.next;
			i++;
		}
		if (p.next != null)
		{
			head = p.next;
			p.next = null;
		}
		else
			return head;
		p = head;
		while (p.next != null)
			p = p.next;
		p.next = q;
		return head;


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值