Leetcode61:旋轉鏈表
給定一個鏈表,旋轉鏈表,將鏈表每個節點向右移動 k 個位置,其中 k 是非負數,
示例1:
輸入: 1->2->3->4->5->NULL, k = 2
輸出: 4->5->1->2->3->NULL
解釋:
向右旋轉 1 步: 5->1->2->3->4->NULL
向右旋轉 2 步: 4->5->1->2->3->NULL
示例2:
輸入: 0->1->2->NULL, k = 4
輸出: 2->0->1->NULL
解釋:
向右旋轉 1 步: 2->0->1->NULL
向右旋轉 2 步: 1->2->0->NULL
向右旋轉 3 步: 0->1->2->NULL
向右旋轉 4 步: 2->0->1->NULL
鏈表中的點已經相連,一次旋轉操作意味著:
- 先將鏈表閉合成環
- 找到相應的位置斷開這個環,確定新的鏈表頭和鏈表尾
如何找到新鏈表的頭節點?
若k<count,其中 count 是鏈表中點的個數:
在位置 count-k 處,新的鏈表尾就在頭的前面,位于位置 count-k-1,
若 k >= count:
只需要考慮 k%count 的部分,這個值一定比 count 小,k-k%count 這部分肯定是count的整數倍形成換狀,
/**
* 給定一個鏈表,旋轉鏈表,將鏈表每個節點向右移動 k 個位置,其中 k 是非負數,
* @param head
* @param k
* @return
*/
public ListNode rotateRight(ListNode head, int k) {
if(head == null){
return null;
}
//形成倍訓
ListNode tail = head;
int count = 1;
while (tail.next != null){
tail = tail.next;
count ++;
}
tail.next = head;
int len;
if(count > k){
len = k;
}else {
len = k % count;
}
int right = count - len;
for(int i=0; i<right; i++){
head = head.next;
tail = tail.next;
}
tail.next = null;
return head;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/166673.html
標籤:其他
