您的位置:首页 > 其它

Rotate List

2016-05-27 10:54 411 查看
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。

(1)使用两个指针,一个指向开始的位置,一个指向开始位置的后面的第k个位置,然后开始遍历链表,当后面的那个指针指向最后一个节点的时候,前面的那个指针指向倒数第k个节点的之前的那个节点。而后修改对应的指针的位置就可以了。

(2)注意处理k的问题,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||head->next==NULL||k<=0) //一个元素的时候怎么移动都没有区别
return head;
ListNode *res=new ListNode(0);
res->next=head;
ListNode *slow=head,*fast=head;
int len=0;
while(slow)
{
slow=slow->next;
len++;
}
k%=len;
slow=head;
for(int i=0;i<k&&fast;i++)
fast=fast->next;
if(k==0||fast==NULL)
return head;
while(fast->next) //
{
slow=slow->next;
fast=fast->next;
}
//deal
res->next=slow->next;
slow->next=NULL;
fast->next=head;
return res->next;
}
};

方法二:使用一个指针也可以,就是在第一遍求得链表长度结束之后,将链表的最后一个节点的指针指向起始的位置,这样真个链表就变成一个循环链表。在第一遍遍历结束之后,求得长度为len,然后再接着走 len-k%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||head->next==NULL||k<1)
return head;
ListNode *p=head;
int len=1;
while(p->next)
{
++len;
p=p->next;
}
p->next=head;//将链表首尾相连
k=len-k%len;
while(k>0)
{
p=p->next;
--k;
}
head=p->next;
p->next=NULL;
return head;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: