LeetCode61. 旋转链表
题目描述
/**
*
* 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
*
*/
思路分析
- 旋转链表,也就是将链表的每个节点向右移动 k 个位置,考虑先将链表置为环形链表
- 先计算原始链表的长度,将链表向右移动k个节点,也就是将环形链表从前往后的第 len - k % len个位置断开形成的新链表
- 将新链表返回
- 详解见下
源码及详解
/**
* 旋转链表
* @param head 要旋转的链表
* @param k 移动的次数
* @return 返回旋转后的新链表
*/
public ListNode rotateRight(ListNode head, int k) {
//数据校验
if (head == null || k == 0 || head.next == null) {
return head;
}
//定义变量保存链表的长度
int len = 1;
//定义辅助变量用于遍历链表
ListNode cur = head;
//计算链表的长度
while (cur.next != null) {
cur = cur.next;
len++;
}
//则循环结束后len为链表的长度,并且cur指向链表的末尾
//将链表形成环状
cur.next = head;
//则根据向右移动的位置在指定位置断开环状链表
int index = len - k % len;
//即在index处断开环形链表
ListNode newHead = new ListNode();
cur = head;
for (int i = 0; i < index - 1; i++) {
cur = cur.next;
}
//循环结束时找到要断开的位置
newHead.next = cur.next;
//断开环形链表
cur.next = null;
//返回新链表
return newHead.next;
}