题目: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
题解思路:
方法一:链表头尾相接+巧用环 1.遍历链表获得长度len。可能k会大于len,所以要进行取余处理。 2.遍历到链表末尾结点时,将链表头尾相接,串起来。在遍历到len-k%len个结点时,断开。下一个结点就是旋转链表的头结点了。
函数代码:
class Solution { public: ListNode* rotateRight(ListNode* head, int k) { if(!head||k==0) { return head; } int len=0; ListNode *cur=head; ListNode *p=NULL; while(cur) { p=cur; cur=cur->next; len++; } k=len-k%len; //因为遍历结束时候cur已经为空,所以是空指针 //所以用p指针记录cur的前一个结点 p->next=head; for(int i=0;i<k;i++) { p=p->next; } head=p->next; p->next=NULL; return head; } };