旋转链表

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

示例 1:

输入: 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

示例 2:

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

解决思路:


计算链表的长度N,指向链表最后一个节点的指针end;

实际只需移动k%N个位置;

end.next=head,构成环形链表,同时移动head与end,移动N-k个位置即可。

    public static ListNode rotateRight(ListNode head, int k) {

        if (k == 0 || head == null) return head;
        ListNode end = head;
        int N = 0;  // 链表包含的节点数
        while(end.next != null) {
            end = end.next;
            N++;
        }
        N ++;
        k = k % N;

        end.next = head;
        while(N-k>0) {
            head = head.next;
            end = end.next;
            k++;
        }
        end.next = null;
        return head;
    }

猜你喜欢

转载自www.cnblogs.com/deltadeblog/p/9037771.html
今日推荐