• LeetCode61. 旋转链表


    自己想的方法是:

    1. 求出链表长度

    2. 找出倒数第K个节点的前一个节点

    3. 断开链表,寻找后半部分链表的末尾节点,然后接上前半部分

    上述方法的缺点是:寻找后半部分链表的末尾节点又需要遍历一次。

    改进思路1:通过快慢指针寻找倒数第k个节点的前一个节点,最后快指针指向后半部分链表的末尾节点

    改进思路2:先将链表闭合成环,找到相应的位置断开这个环,确定新的链表头和链表尾

    class Solution {
        public ListNode rotateRight(ListNode head, int k) {
            if (head == null || head.next == null || k == 0) return head;
            /**
             * 改进思路1:快慢指针
             */
            /*
            int len = 1;
            ListNode cur = head;
            while (cur.next != null) {
                cur = cur.next;
                len ++;
            }
            k = k % len;
            if (k == 0) return head;
            ListNode fast = head, slow = head;
            for (int i = 0; i < k; i++) {
                fast = fast.next;
            }
            while (fast.next != null) {
                fast = fast.next;
                slow = slow.next;
            }
            ListNode newHead = slow.next;
            slow.next = null;
            fast.next = head;
            return newHead;
            */
            /**
             *  改进思路2:闭合成环后遍历
             */
            // Step1 :求出链表长度
            int len = 1;
            ListNode cur = head;
            while (cur.next != null) {
                cur = cur.next;
                len ++;
            }
            k = k % len;
            if (k == 0) return head;
            // Step2 :闭合成环
            cur.next = head;
            // Step3 :寻找倒数第k个节点的前一个节点
            for (int i = 0; i < len - k; i++) {
                cur = cur.next;
            }
            ListNode newHead = cur.next;
            cur.next = null;
            return newHead;
        }
    }
  • 相关阅读:
    《山里的日子(记录片)》观后感——回不去的农村
    Android事件分发传递
    《活着》观后感——时代
    Android6.0动态获取权限
    Androidannotations框架
    Android屏幕适配笔记
    Android 网络状态检测
    氢氘交换
    springboot datajpa 简明说明
    算法学习
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/14135680.html
Copyright © 2020-2023  润新知