如题:
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4输出:[2,0,1]
提示:
- 链表中节点的数目在范围
[0, 500]
- -100
- 0
看到题目,第一眼在想,这不是换位置吗?不过既然是首尾相连,那么但是在三维的角度看,这是形成了一个圈圈
那我应该把他串起来,然后根据k去不断的推,就可以知道新的链表起点了
但是我串起来以后有个问题,我知道起点,我还需要知道尾节点,不然我不知道从哪里打断
但是通过首节点获取上一节点好像emmmm,那么,我换种思路
我不知道k会多长,可能超过我的链表,可能比我的链表短,但是如果我算出来链表长度len,可以知道具体应该走多少步(k%len)
这个时候,我使用len-(k-len)就可以知道,再走多少步可以走完这条链表。那么我就获得了新链表的尾结点,再通过尾结点.next,可以知道首节点。OK
class Solution {
public ListNode rotateRight(ListNode head, int k) {
//1.特例处理
if (head == null || head.next == null || k == 0) {
return head;
}
//2.计算链表长度
int len = 1;
ListNode cur = head;
while (cur.next != null) {
cur = cur.next;
len++;
}
//3.计算实际移动的步数 ,其中,k%len可以获得新的头节点的位置,
// 但是我们需要断开链表,所以需要知道新的尾节点的位置,所以需要计算len-k%len
int move = len - k % len;
//4.构建环形链表
cur.next = head;
//5.找到新的头节点
for (int i = 0; i < move; i++) {
cur = cur.next;
}
//6.找到新的尾节点
ListNode newHead = cur.next;
cur.next = null;
return newHead;
}
}