給你一個鏈表的頭節點?head
?,旋轉鏈表,將鏈表每個節點向右移動?k
?個位置。
示例 1:
輸入:head = [1,2,3,4,5], k = 2 輸出:[4,5,1,2,3]
示例 2:
輸入:head = [0,1,2], k = 4 輸出:[2,0,1]
提示:
- 鏈表中節點的數目在范圍?
[0, 500]
?內 -100 <= Node.val <= 100
0 <= k <= 2 * 109
題目分析
該題給出應該鏈表,以及應該正整數,要求我們將鏈表中的節點向前移k個位置,這題我們可以轉換思想就會變得很簡單。
解題思路
我們可以通過遍歷鏈表,計算出鏈表的長度,并且將鏈表首尾連接起來,因為給出的正整數k又可能大于鏈表的長度n,所以我們需要計算指針在一圈里面需要走多少,所以求得k除n的余數。因為遍歷鏈表后,此時指針位于鏈表的尾部,如果此時需要向前移倆個單位,我們可以理解為:要把后面的倆個節點移到最前面。則在遍歷環的時候,走到這倆個節點前,斷開環,則我們可以得到目標鏈表。
struct ListNode* rotateRight(struct ListNode* head, int k) {if(k == 0 || head == NULL || head->next ==NULL){return head;}int n=1;struct ListNode* cur = head;while(cur->next != NULL) {cur = cur->next;n++;}int add = n - k % n;if(add == n) {return head;}cur->next = head;//連接該鏈表的首尾while(add--) {cur = cur->next;}struct ListNode* prev = cur->next;cur->next = NULL;return prev;
}
總結
在最近做鏈表題中我覺得鏈表題中,應該有以下注意點
- 做題判斷有沒有特殊情況,比如該題當正整數為0或鏈表長度為0或1的時候,就無需判斷直接返回結果即可,這會簡便我們的程序。
- 我們要注意節點的變換和遍歷鏈表的方式,指針的移動,如果這些無法處理好可能會導致死循環。