解题思路:统计链表长度后,找到新链表首元素的位置。断开旧链表,链接新链表
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head==NULL)
return head;
ListNode *left = head,*right = head;
int len = 1;
while(right->next){
right = right->next;
len++;
}
k = k%len;
if(len==k)
return head;
for(int i=1;i<len-k;i++)
left = left->next;
if(right!=head){
right->next = head;
head = left->next;
left->next = NULL;
}
return head;
}
};
解题思路:之后看到别人提供的类似解题方法,更加的优化简洁。巧妙地利用了单来表的性质,将单链表首尾相连成环后找到新链表首元素的位置,切开链表环,返回新链表首元素地址。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head==NULL)
return head;
ListNode *newh = head,*tail = head;
int len = 1;
while(tail->next){
tail = tail->next;
len++;
}
k = k%len;
if(len==k)
return head;
tail->next = head;
for(int i=0;i<len-k;i++)
tail = tail->next;
newh = tail->next;
tail->next = NULL;
return newh;
}
};