1.5将单链表向右旋转k个结点

1.题目

如何将单链表向右旋转k个位置。
给定单链表1->2->3->4->5->6->7, k = 3,那么旋转后的单链表变为5->6->7->1->2->3->4

2.解法

public class Sort {
    /**
     * 功能描述: 根据k的个数,将链表向右旋转k个位置
     * 输入参数: 链表头结点
     * 利用了寻找倒数第k个结点的知识
     */

    public static void rightRotate(Node head, int k){
        if(head == null || head.next == null || k < 1){
            return;
        }

        // 前部分有k+1个结点,后半部分有k个结点
        // 所以使用快慢指针移动是可以的,之间维持k个结点
        Node slow, fast, tmp;
        slow = fast = head.next;

        // 1.先将fast移动到第k个位置
        for(int i = 1; i <= k; i++){
            // 如果结点为 null,说明没有第k个位置, 说明已经超过链表长度
            if(fast.next != null){
                fast = fast.next;
            } else {
                return;
            }
        }

        // 2.slow和fast同步移动,fast移动到尾结点时,slow正好
        while(fast.next != null){
            slow = slow.next;
            fast = fast.next;
        }

        // 3.开始连接结点
        tmp = slow.next;
        slow.next = null;
        fast.next = head.next;
        head.next = tmp;
    }

    public static void main(String[] args) {
        // 假的头结点
        Node head = new Node(-1);
        Node cur = head;
        Node tmp = null;

        for(int i = 1; i < 8; i++){
            tmp = new Node(i);
            cur.next = tmp;
            cur = tmp;
        }
       // 向右旋转 
       rightRotate(head, 3);
       for (cur = head.next; cur != null; cur = cur.next){
           System.out.print(cur.data + " ");
       }
    }
}

3.思路

1.首先找到链表的倒数第k+1个结点slow和尾巴结点fast
2.将链表断开成两个子链表,其中后半部分的子链表的结点个数为k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值