本题源自leetcode 61
-----------------------------------------------------------
思路:遍历一遍链表统计长度以及找到链表尾节点。
2 将链表构造成一个环,然后找到要转换的节点的头结点,断开。
代码:
ListNode* rotateRight(ListNode* head, int k) {
if(!head || k == 0)
return head;
int len = 1;
ListNode* p = head;
while(p->next){
p = p->next;
len++;
}
p->next = head; //构成一个环
if(k %= len){
for(int i = 0; i < len - k; i++)
p = p->next;
}
ListNode* pre = p->next;
p->next = NULL;
return pre;
}
思路2 用快慢指针,让快指针先走k步,然后满指针开始走,快指针走到尾节点,慢指针则走到倒数第k个节点的前一个节点。
ListNode* rotateRight(ListNode* head, int k) {
if(!head || k == 0)
return head;
int len = 0;
ListNode* p = head;
while(p){
p = p->next;
len++;
}
k %= len;
ListNode* root = new ListNode(0);
root->next = head;
ListNode* pre = head;
ListNode* post = head;
while(pre && k > 0){
pre = pre->next;
k--;
}
while(pre->next && post){
pre = pre->next;
post = post->next;
}
pre->next = root->next;
root->next = post->next;
post->next = NULL;
return root->next;
}