leetcode:旋转链表
解题思路:
先遍历求出链表的长度,再通过(k%len)找到新的尾节点,形成环形链表,保存新链表的头结点,最后再断开环形链表。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(!head) return 0;
//指针p来计算链表的长度,指针p1是来得到新链表的尾节点,指针p2来形成环形链表
ListNode* p1 = head,* p2 = head, *p = head;
int len = 0;
while(p){
len++;
p=p->next;
}
k %= len;
//p2先移动k个单位,然后再带p1移动L-k-1个单位找到新链表的尾节点
while(k--){
p2 = p2->next;
}
//p1移动L-k-1个单位得到新链表的尾节点
while(p2->next){//p1移动L-k-1个单位到达新链表的尾节点
p1 = p1->next;
p2 = p2->next;
}
p2->next = head;//形成环形链表
ListNode* ans = p1->next;//p1的next节点作为新链表的头结点
p1->next = NULL;//断开环形链表
return ans;//返回头结点
}
};