将最右边的K个元素拼接到最前面去。
大致思路:
我举了个1->2->3的例子模拟了一下,发现就是先一遍循环得到链表长度和链表最后一个结点指针tail,再来一遍循环直到n-k个元素,那么它的下一个元素就作为结果链表的头,让它断开,再把tail->next=head; 最后返回结果链表的头。思路正确。
我发现我现在的链表题编程,需要注意的两个点:
① 要找准返回的头在哪里(比如这道题。还有比如说那种涉及删除有可能删掉原来的头结点的,需要定义一个新头先令->next=head,然后就可以把原来的头结点当成普通的结点来一起做,最后返回的是 新头->next)
② 在指针的while循环,一定要注意别忘了写 p=p->next(这个在其他i j的while循环中也要注意,不能不动呀。。)
AC代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *rotateRight(ListNode *head, int k) {
ListNode *p = head;
if(head==NULL||k==0)
return head;
int n=0;
ListNode *tail=NULL;
while(p)
{
n++;
tail = p;
p = p->next;
}
if(k%n==0) //说明把整体拼到前面去,相当于不变
return head;
p = head;
int cnt=0;
while(p)
{
cnt++;
if(cnt==n-k%n) //此题设定有点奇葩的是k有可能>n,所以取余
break;
p=p->next;
}
ListNode *new_head = p->next;
p->next=NULL;
tail->next=head;
return new_head;
}
};