题解 | #转动链表#
转动链表
http://www.nowcoder.com/practice/afbec6b9d4564c63b2c149ccc01c5678
题目描述:将给定的链表向右转动k个位置,k是非负数。
例如:给定1->2->3->4->5->null , k=2,返回4->5->1->2->3->null。
示例1:
输入:{1,2},1
返回值:{2,1}
思路:将给定的链表向右旋转k个位置,若链表为空则直接返回该链表;若链表不为空,则首先需要计算出链表的长度len,当k是链表长度len的整数倍时返回链表即可,反之需要令k%=len,然后遍历链表到第(len-k)个节点并截断,之后将两段连接上即可得到转动后的链表。具体代码如下:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* rotateRight(ListNode* head, int k)
{
// write code here
if(head == NULL) return NULL;
else
{
ListNode *res = (ListNode*)malloc(sizeof(ListNode)),*p = head;
int len=0;
while(p != NULL)
{
len++;//统计链表的长度,即链表中元素的个数
p = p->next;
}
if(k <= 0 || (k % len == 0))
return head;
else
{
if(len == 1) return head;
k %=len;
int n=0;
p = head;
ListNode *q;
while(n <=(len-k) && p != NULL)
{
n++;
if(n == (len - k))
{
q = p->next;
p->next = NULL;
break;
}
p = p->next;
}
res->next = q;
while(q != NULL)
{
if(q->next == NULL)
break;
q = q->next;
}
q->next = head;
return res->next;
}
}
}
};
查看15道真题和解析