您的位置:首页 > 其它

LeetCode | Rotate List(循环右移链表)

2014-08-18 15:16 316 查看
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>n的时候k = k%n。然后再进行,也就是要先遍历一边链表求出其长度。

有了链表以后,也不能直接找到n-k-1的结点,因为链表最后的指针还要指向头结点。但网友有个办法,遍历链表时只遍历到最后一个结点然后计算总长度。

先上自己的代码:

class Solution {
public:
ListNode *rotateRight(ListNode *head, int k) {
if(head == NULL || k <= 0)
return head;

int n = 0;
ListNode *p = head;
while(p){
p = p->next;
++n;
}
if(k%n == 0)
return head;
k = k%n;    //循环找
p = head;
int i = 1;
//找到第k个节点
while(p->next && i < k){
p = p->next;
i++;
}
//这时候p一定不为NULL,因为k<n
ListNode *q = head;
p = p->next;
while(p->next != NULL){
p = p->next;
q = q->next;    //p遍历完以后,指向倒数第K+1个结点
}
p->next = head;
head = q->next;
q->next = NULL;
return head;
}
};


再看网友的代码:

class Solution {
public:
ListNode *rotateRight(ListNode *head, int k)
{
if(head==NULL)return NULL;
ListNode *p=head;
int n=0;
while(p->next)
{
p=p->next;
n++;
}
n++;
k=k%n;
p->next=head;   //这里就处理了尾指针
ListNode *q=head;
for(int i=0;i<n-k-1;i++)
q=q->next;
head=q->next;
q->next=NULL;
return head;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: