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) {
        if(k==0||head==null||head.next==null){
            return head;
        }
        int n =1;
       ListNode iter = head;
        while (iter.next != null) {
            iter = iter.next;
            n++;
        }
        int add = n - k % n;
        if (add == n) {
            return head;
        }
        iter.next = head;
        while (add-- > 0) {
            iter = iter.next;
        }
       ListNode ret = iter.next;
        iter.next = null;
        return ret;
    }
}

本题知识点分析:

1.链表遍历和取值

2.前驱节点和后继结点

3.虚拟头结点

4.数学模拟

本题解题思路分析:

1.{1,2,3,4,5,6,7,8,9},3 -->{7,8,9,1,2,3,4,5,6} 首先这题解题思路是什么?其实是找到6和7的中间这个点

2.只要6.next= null,7当做第一个结点那么就完成了

3.而这个点,需要进行计算, int add = n - k % n; 9-3%9 = 6;

4.先计算链表长度

5.然后使整个链表为环形链表

6.根据add去找到这个关键点

7. ListNode ret = iter.next; 这时候ret为7,而iter为6的地址,用临时变量保存7的地址,又因为是环形链表因此已经形成 -> {7,8,9,1,2,3,4,5,6},最终让节点的值为6的地址赋值为null

本题使用编程语言: JAVA

如果本篇文章对您有帮助的话,可以点个赞支持一下,感谢~