旋转链表

题目

给定一个链表,旋转链表,使得每个节点向右移动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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值