题解 | #牛群旋转#
牛群旋转
https://www.nowcoder.com/practice/5137e606573843e5bf4d8ea0d8ade7f4?tpId=354&tqId=10591410&ru=/exam/oj&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj
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
如果本篇文章对您有帮助的话,可以点个赞支持一下,感谢~
高频面试算法题解 文章被收录于专栏
高频面试算法题解,每天一小步,人生一大步,跟着一起刷起来!