旋转链表
题目描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例
Java代码1(构建闭合环法)
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null || head.next == null || k == 0) return head;
ListNode temp = head;
int count = 1;
while(temp.next != null) {
temp = temp.next;
count++;
}
k %= count;
if(k == 0) return head;
temp.next = head;
for(int i = 0; i < count - k; i++) {
temp = temp.next;
}
ListNode ans = temp.next;
temp.next = null;
return ans;
}
}
Java代码2(双指针法)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null || head.next == null) return head;
ListNode root = new ListNode(0);
root.next = head;
int count = 1;
while(head.next != null) {
count++;
head = head.next;
}
k = k % count;
if(k == 0) return root.next;
ListNode cur = root, pre = root;
while(k != 0) {
cur = cur.next;
k--;
}
while(cur.next != null) {
cur = cur.next;
pre = pre.next;
}
cur.next = root.next;
root.next = pre.next;
pre.next = null;
return root.next;
}
}