旋转链表

思路:

1.先用一个hashmap将对应的下标和节点的值存起来

2.再遍历一遍链表,对原链表中的节点的值进行修改,根据下标查找对应的节点,将后面的k个节点进行平移到前面,

将前面的平移到后面(实际上是进行了修改)

3.注意取余操作

代码:

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    public ListNode rotateLinkedList (ListNode head, int k) {
        //先判断两种特殊情况:如果发现链表为空或者k==0(就是表明需要移动的是整个链表,将整个链表移动到最前面,但是很明显就等价于没有移动),所以不需要特殊处理
        if(head==null||k==0){
            return head;
        }
        //建立一个hashmap,设置两个关键字,一个是下标,一个是对应的节点的值
        Map<Integer,Integer> map=new HashMap<>();
        ListNode temp1=head;
        //记录链表的长度
        int len=0;
        //第一次遍历整个链表,将每个节点的值都存入到hashmap的对应的位置
        for(int i=0;temp1!=null;i++){
            map.put(i,temp1.val);
            temp1=temp1.next;
            len++;
        }
        //注意千万不要忘记将k对len进行取余处理,便于后面的操作
        k=k%len;
        //第二次遍历hashmap,对原来的表进行修改,将后面的k个节点的向前平移到最前面(即将前几个数改为后面的k个数),再将剩下的数改为原先位于最前面的数,即将前面的数平移到后面
        ListNode temp2=head;
        for(int i=0;temp2!=null;i++){
            temp2.val=map.get((len-k+i)%len);
            temp2=temp2.next;
        }
        return head;

    }
}