题目
题目链接:
https://www.nowcoder.com/practice/1ad00d19a5fa4b8dae65610af8bdb0ed?tpId=196&tqId=39404&rp=1&ru=/exam/company&qru=/exam/company&sourceUrl=%2Fexam%2Fcompany&difficulty=undefined&judgeStatus=undefined&tags=&title=
思路
解题步骤:
1.先统计链表的节点总数cnt,对k取模,k=k%cnt
2.新建结果链表头节点left,值为-1,值可以随意,因为结果返回left.next
3.从head头开始移动柜cnt-k哥位置,后面的节点依次拼接到left链表上
4.在第三步基础上,从参数head头开始,依次拼接cnt-k个节点到left上
5.返回left.next
参考答案Java
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 rotateLinkedList (ListNode head, int k) {
if (head == null) return head;
ListNode cur = head;
int cnt = 0;
while (cur != null) {
cnt++;
cur = cur.next;
}
k = k % cnt;
if (k == 0) return head;
int move = cnt - k;
ListNode left = new ListNode(-1);
ListNode lefttail = left;
cur = head;
//第一步:先走到截取的位置
for (int i = 0; i < move; i++) {
cur = cur.next; //移动到截取的位置,这个位置就是返回值的头节点
}
//第二步:从截取的位置开始往结果链表left拼接
while (cur != null) {
ListNode next = cur.next;
cur.next = null;
lefttail.next = cur;
lefttail = cur;
cur = next;
}
//开头的节点,即截取的链表的右边在left开头的链表中了
//第三步:接下来拼接截取的左边的链表
cur = head;
for (int i = 0; i < move; i++) {
ListNode next = cur.next;
cur.next = null;
lefttail.next = cur;
lefttail = cur;
cur = next;
}
return left.next;
}
}