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 };

 

posted @ 2021-03-31 17:20  Mrsdwang  阅读(39)  评论(0编辑  收藏  举报