题目描述

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

示例:

输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL

思路

1.首先我们可以遍历一次链表,获取链表的长度n。
2.我们可以将头结点移动 (n-k%n -1)次 获取后半部分的链表。
3.我们可以将后半部分连接的下一个结点保存起来,那便是前一部分的链表。
4.最后将前后两部分的链表拼接到一起即可。
5.注意将后半部分的链表尾部置空即可。

Java代码实现

   public ListNode rotateRight(ListNode head, int k) {
        //首先获取链表的长度
        ListNode p = head;
        int len = 0;
        while(head != null){
            len++;
            head = head.next;
        }
        //不需要移动链表,直接返回即可
        if(len == 0 || len == 1 || k == 0 || k%len == 0)
            return p;
        //头部需要移动的距离
        int tailDis = len-k%len-1;
        ListNode last = p;
        //后半部
        ListNode behind = last;
        while(tailDis>0){
            tailDis--;
            last = last.next;
        }
        ListNode front = last.next;
        ListNode res = front;
        //尾部链表置空
        last.next = null;
        //拼接链表
        while(front.next != null){
            front = front.next;
        }
        front.next = behind;

        return res;
    }

Golang代码实现

func rotateRight(head *ListNode, k int) *ListNode {
    if head == nil || k == 0{
        return head
    }
    len := 0

    p := head

    for p != nil {
        p = p.Next
        len++
    }

    if(len == 1 || k%len == 0){
        return head
    }

    step := len - k%len -1

    p = head
    tail := p

    for step>0 {
        p = p.Next
        step--
    }

    newHead := p.Next
    p.Next = nil

    p = newHead

    for p.Next != nil  {
        p = p.Next
    }
    p.Next = tail

    return newHead

}