算法通关村第一关---链表经典问题之旋转链表笔记

算法通关村第一关—链表经典问题之旋转链表笔记

源码地址:GitHub-算法通关村

题目地址:LeetCode

image-20230719141104100

解题思路:

  1. 首先检查输入的链表是否为空(head == null)或者k是否为0。如果是其中之一,直接返回原链表,因为旋转0次或者对空链表旋转没有任何变化。
  2. 定义三个指针变量:tempslowfast,它们都初始化为链表的头节点head。其中,temp用于最后返回结果,slowfast用于找到旋转后的新头节点。
  3. 使用一个循环遍历链表,计算链表的长度len。此时head指针被移动到了链表的尾部,用于后续的操作。
  4. 如果k是链表长度len的倍数,说明旋转后的链表和原链表相同,因此直接返回原链表head
  5. 如果k不是链表长度len的倍数,则需要进行旋转操作。首先,通过一个循环将fast指针向后移动k次,即找到旋转后的新头节点的前一个节点。
  6. 接下来,使用两个指针slowfast一起移动,直到fast指针指向链表的最后一个节点。此时slow指针指向旋转后的新头节点的前一个节点。
  7. slow的下一个节点作为新的头节点,将fastnext指针指向原链表的头节点,实现链表的旋转。
  8. 最后,返回新的头节点,即res
/**
     * 旋转链表
     *
     * @param head
     * @param k
     * @return
     */
    public ListNode rotateRight(ListNode head, int k) {
        // 1. 判断链表是否为空或k是否为0
        if (head == null || k == 0) {
            return head;
        }
        // 2. 定义所需变量结点
        ListNode temp = head;
        ListNode slow = head;
        ListNode fast = head;
        int len = 0;
        // 3. 求出链表长度
        while (head != null) {
            head = head.next;
            len++;
        }
        // 4. k如果是链表长度的倍数则相当于没移,直接返回
        if (k % len == 0) {
            return temp;
        }
        // 5. 先让快指针走k步
        while ((k % len) > 0) {
            fast = fast.next;
            k--;
        }
        // 6. 快慢指针一起移动,知道快指针移到最后一个结点
        while (fast.next != null) {
            slow = slow.next;
            fast = fast.next;
        }
        // 7. 拼接链表
        ListNode res = slow.next;
        slow.next = null;
        fast.next = temp;
        // 8. 返回
        return res;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值