LeetCode 61. Rotate List
看了网上别人的代码总算搞懂了题意,把整个链表分为两部分,左边有len-k个节点,右边有k个节点,然后这两部分次序调换。
注意有k>len的情况,因此首先要处理k,k=k%len。
首先遍历至链表尾,将表尾链至表头(tmp->next = head),形成一个闭环,再从表尾出发,经过len - k % len个节点,在此将闭环剪断(tmp->next = NULL)。
这个算法可一定程度上减少遍历的节点数,不用得到len后再从表头出发找断点。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* rotateRight(ListNode* head, int k) { 12 if(head == NULL) return head; 13 int len =1; 14 ListNode* tmp = head; 15 while(tmp->next != NULL){ 16 ++len; 17 tmp = tmp->next; 18 } 19 tmp->next = head; 20 21 int res = len - k % len; 22 while(res != 0){ 23 --res; 24 tmp = tmp->next; 25 } 26 ListNode* resH = tmp->next; 27 tmp->next = NULL; 28 return resH; 29 30 } 31 };