給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 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輸出:解題思路:先遍歷一遍,得出鍊錶長度 len,注意 k 可能大於 len,因此令k = (len + (k % len)) % len;。2->0->1->null
解釋:向右旋轉 1 步: 2->0->1->null向右旋轉 2 步: 1->2->0->null
向右旋轉 3 步:
0->1->2->null
向右旋轉 4 步:2->0->1->null
尾部下乙個設為null即可。使用快慢指標操作,如找鍊錶環等都使用此操作,倒數第k個結點。
/**
* @classname: main
* @description: todo
* @author: mr.ye
* @data: 2018-11-18 20:14
* @version: 1.0
**/class listnode
}class solution
int n = k;
listnode old = new listnode(0);// 新建乙個結點,利於操作
old.next = head;
listnode fast = old; // 快指標
listnode slow = old; // 慢指標
int len = 0;
while(fast.next != null)
fast = old; // 讓快指標從新指向頭結點
n = (len + (n % len)) % len; // 最主要的是 k 肯能是 大於節點長度的。 所以取k 的有效長度
if (n == 0) // 不需要翻轉
return old.next;
while(n > 0)
while(fast.next != null)
old.next = slow.next; // 重新改變整個節點的鏈結
slow.next = fast.next;
fast.next = head;
return old.next;
}}public class main
public static void print(listnode head)
system.out.println("null");}}
方法2:
class solution
int n = k;
if (head == null || head.next == null || n < 1)
listnode root = new listnode(0);
root.next = head;
listnode p = root;
listnode q = root;
int count = 0;
for (int i = 0; i <= n; i++)
}// 找到第乙個要交換的結點的前驅
// q為第乙個要交換的結點的前驅
while (p != null)
p = q;
q = root;
if (p != null && p.next != null)
}return root.next;
}
執行結果: 61 旋轉鍊錶
給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 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 ...
61,旋轉鍊錶
給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 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 nul...
61 旋轉鍊錶
給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 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 ...