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

 

posted @ 2016-03-14 19:45  co0oder  阅读(146)  评论(0编辑  收藏  举报