旋转链表
思路:
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;
}
}