題目地址:
https://leetcode.com/problems/rotate-list/
給定一個單鏈表,再給定一個正整數,返回其向右旋轉步後得到的鏈表。旋轉步指的是原鏈表的表尾連到了表頭上,並且把原表尾前一個節點與表尾切斷,把這個表尾當成新的鏈表頭。
思路是,先算出鏈表長度,然後旋轉次等價於旋轉次。接着,先找到第個節點,然後將鏈表尾連到鏈表頭上,最後將第個節點與其下一個節點斷開,斷開後的下一個節點即爲新鏈表頭。代碼如下:
public class Solution {
public ListNode rotateRight(ListNode head, int k) {
if (head == null) {
return null;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
// 先算長度
int len = 0;
while (prev.next != null) {
len++;
prev = prev.next;
}
k %= len;
// 接着找第len - k個節點
prev = dummy;
for (int i = 0; i < len - k; i++) {
prev = prev.next;
}
// 然後找尾節點,連到頭上
ListNode tail = prev;
while (tail.next != null) {
tail = tail.next;
}
tail.next = head;
// 此時prev.next就是新鏈表頭,然後還需要把prev和其後的節點斷開
head = prev.next;
prev.next = null;
return head;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
時間複雜度,空間。