题目连接:https://leetcode.com/problems/rotate-list/#/description
题目大意:
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.
解题思路:
类似的链表题目很多,有时间还是要整理一下,今天就是只是针对这个题给出解题思路。
- 首先对链表进行遍历,遍历的目的有两个,第一就是获得链表有多少个节点;第二就是获得链表的结尾节点(也就是null的前一个节点)。
- 然后进行链表的尾-首连接,也就是末尾节点的next指向head节点。
- 第一次遍历已知链表的总共节点数 total,那么total-k便是链表左半部分的节点数left;
- 从head开始找left个节点这样就找到了反转后新的尾节点,也就找到了新的head节点,则该问题解决。
注意 :可能存在total - k =0的情况,所以为了统一处理我把第一次遍历我把head指向了尾节点,这样如果是total-k==0的情况,正好把head往后移动一个节点。
下面给出代码:
public class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head==null) return head;
int total =1;
ListNode p=head,rear;
while(p.next!=null){
total++;
p=p.next;
}
p.next = head;
head = p;
if(k>total)
k=k%total;
int left = total-k;
p = head;
while(left>0){
left--;
p=p.next;
}
rear = p;
head = rear.next;
rear.next=null;
return head;
}
}
运行结果: