import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode rotateLeft (ListNode head, int k) {
// write code here
// 处理特殊情况
if (head == null || head.next == null || k == 0) {
return head;
}
int len = 1; // 链表长度
ListNode tail = head; // 尾节点
// 找到尾节点并计算链表长度
while (tail.next != null) {
len++;
tail = tail.next;
}
// 首尾相连形成环
tail.next = head;
k = k % len; // 处理k大于链表长度的情况
// 找到需要断开的位置
ListNode newTail = head;
for (int i = 0; i < len - k - 1; i++) {
newTail = newTail.next;
}
// 断开环,得到新的头节点
ListNode newHead = newTail.next;
newTail.next = null;
return newHead;
}
}
- 首先处理特殊情况,如果链表为空、只有一个节点或者旋转次数为0,则直接返回原链表。
- 通过遍历链表找到尾节点并计算链表长度。接下来,将尾节点与头节点相连,形成一个环。
- 对于旋转次数 k,如果 k 大于链表长度,则取 k 除以链表长度的余数。
- 需要找到需要断开的位置。通过遍历找到新的尾节点,即原头节点的前一个节点。
- 断开环,将新的尾节点的 next 指针设为 null,并返回新的头节点。
通过这种方法,可以实现链表的旋转,时间复杂度为 O(n),其中 n 是链表的长度。
该题考察的知识点是链表的操作和旋转。
具体涉及到的知识点包括:
- 链表的基本结构和操作:链表由节点组成,每个节点包含一个值和指向下一个节点的指针。常见的链表操作有遍历、插入、删除等。
- 旋转链表:旋转链表即将链表中的节点向右移动 k 个位置。这里需要注意处理旋转次数大于链表长度的情况。旋转链表可以通过修改指针的方式来实现。

京公网安备 11010502036488号