题解 | #旋转链表#
旋转链表
https://www.nowcoder.com/practice/1ad00d19a5fa4b8dae65610af8bdb0ed
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param k int整型 * @return ListNode类 */ ListNode* rotateLinkedList(ListNode* head, int k) { // write code here if(!head||!head->next||!k){ return head; }//防止传参:空指针、单节点、空旋转数量 ListNode* dummy=new ListNode(0); dummy->next=head;//0头节点指向首节点 int count=0;//链表节点数量计数器 ListNode* end=dummy; while(head){ count++; end=end->next;//同时end指针指向链表的结尾部分 head=head->next; } if(k>count){//如果k移动的数量超过了节点数量,则其实就是移动了对K取余的数量,比如长7的链表移动7次还是本身。这一点我一开始没有想到,测试的时候才想到。 k=k%count; } ListNode* start=dummy; for(int i=0;i<count-k;k++){//start指针指向要断开的前半截的末尾节点 start=start->next; } ListNode* then=start->next;//then指针指向要断开的后半截的首节点 end->next=dummy->next;//开始进行重新链接 dummy->next=then; start->next=nullptr; ListNode* result=dummy->next;//释放堆空间,防止内存泄露 delete dummy; return result; } };