一、题目
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
二、思路
1.双指针
求出链表的总长度,然后取模。然后这个时候我们准备两个指针,一个快指针,一个慢指针
快指针我们让他先走k步,然后快指针和慢指针在一起走,当快指针走到终点的时候,我们的慢指针正好指向要反转的链表的前一个节点。
三、代码
1.双指针java
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if (head == null) {
return null;
}
int size = 0;
ListNode cur = head;
while (cur != null) {
size++;
cur = cur.next;
}
int number = k % size;
if (number == 0) {
return head;
}
cur = head;
ListNode fast = head;
for (int i = 0; i < number; i++) {
fast = fast.next;
}
while (fast.next != null) {
cur = cur.next;
fast = fast.next;
}
ListNode node = cur.next;
ListNode tmp = node;
cur.next = null;
for (int i = 1; i < number; i++) {
tmp = tmp.next;
}
tmp.next = head;
return node;
}
}
四、总结
1.双指针的话空间复杂度是O(1)