61. Rotate List
仅供自己学习
思路:
刚开始看题感觉会很简单,因为只要改变最后一个节点的next和上一个节点的next就可以了嘛,但是发现如何定位最后一个结点的上一个节点呢。然后就想两个for循环每次移动都遍历一次找到最后一个节点,然后就超时了。
因为当K>链表长度后,移动后的链表相当于 只移动了链表长度-(K-链表长度)这么多次,所以考虑成环这种情况,虽然成环遍历节点数仍然不变,但可以通过让K取余数从而只用移动 链表长度-(K-链表长度)那么多次。
首先先判断head是否为空或者next为空或者k=0,如果是就返回head。然后就遍历链表找到最后一个节点cur并且记录长度。通过关系 re=len-(k-len)获得实际移动的次数。
然后判断re是否等于len,如果等于相当于没有移动,直接返回head,否则将最后一个节点cur的next连接head,然后循环re次,将cur=cur->next,我们会发现此时cur就位于我们想要的新链表的开始节点的前一个结点,我们在定义一个指针指向下一个节点,也就是新链表的开始节点,然后cur指向的节点的next设为NULL;
代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode() : val(0), next(nullptr) {} 7 * ListNode(int x) : val(x), next(nullptr) {} 8 * ListNode(int x, ListNode *next) : val(x), next(next) {} 9 * }; 10 */ 11 class Solution { 12 public: 13 ListNode* rotateRight(ListNode* head, int k) { 14 if(head==NULL||head->next==NULL||k==0) return head; 15 ListNode* cur =head; 16 int len=1; 17 while(cur->next!=NULL){ 18 cur=cur->next; 19 len++; 20 } 21 22 int re=len-k%len; 23 if(re == len) return head; 24 cur->next=head; 25 while(re--){ 26 cur=cur->next; 27 } 28 ListNode* res=cur->next; 29 cur->next=nullptr; 30 return res; 31 } 32 };