struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode* rotateRight(ListNode* head, int k) { int level = -1; int size = 0; ListNode *ptr = head; while(ptr != nullptr) //必定要找到size,並取餘,否則這個算法就是錯的 { size++; ptr = ptr->next; } if(size == 0) return nullptr; cout << k%size<<endl; ListNode *newhead = findNewHead(head, k%size, level); ptr = head; while( ptr != nullptr) { if(ptr->next == newhead) ptr->next = nullptr; //要將新的頭節點的前前節點設置爲nullptr ptr = ptr->next; } ptr = newhead; while(ptr != nullptr && ptr->next != nullptr && ptr != head) // Error: 要找到最後一個,再鏈接到head ptr = ptr->next; if(ptr!= nullptr && ptr->next == nullptr && ptr != head) ptr->next = head;//Error:要判斷ptr是否是head,否則容易產生環狀 if(newhead == nullptr) newhead = head; //newhead返回nullptr時如何處理也很是關鍵 return newhead; } ListNode* findNewHead(ListNode * node, int k, int& level) { ListNode* newhead = nullptr; if(node == nullptr) {level = 0; return nullptr;} if(level < 0) newhead = findNewHead(node->next, k, level); if(level == k) { return newhead; //哪條路徑返回什麼值也必定要搞清楚 } if(level >= 0) level++; return node; //哪條路徑返回什麼值也必定要搞清楚 } };