您的位置:首页 > 其它

旋转链表

2016-07-14 16:14 162 查看

题目

给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数

样例

给出链表1->2->3->4->5->null和k=2

返回4->5->1->2->3->null

解题

找到第k个结点

找到最好一个结点

最后一个结点链接到头结点

第k个结点后面断开

/**
* Definition for singly-linked list.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) {
*         val = x;
*         next = null;
*     }
* }
*/
public class Solution {
/**
* @param head: the List
* @param k: rotate to the right k places
* @return: the list after rotation
*/
public ListNode rotateRight(ListNode head, int k) {
// write your code here
if(k<0)
return null;
if(k==0||head==null || head.next==null)
return head;
int size = size(head);
k = k%size;
k = size - k;
ListNode kNode = head;
while(k>1){ // 找到第 k个结点
k--;
kNode = kNode.next;
}
ListNode lastNode = kNode;
while(lastNode.next!=null){ // 找到最好一个结点
lastNode = lastNode.next;
}
lastNode.next = head; // 最后一个结点链接到头结点
ListNode newHead = kNode.next; // 新的头结点是 k + 1 结点
kNode.next =null; // 第k个结点后断开
return newHead;

}

public int size(ListNode head){
ListNode p = head;
int size = 0;
while(p!=null){
p = p.next;
size++;
}
return size;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: