首页 > 其他 > 详细

LeetCode61. 旋转链表

时间:2020-12-15 10:34:45      阅读:28      评论:0      收藏:0      [点我收藏+]

技术分享图片

自己想的方法是:

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;
    }
}

 

LeetCode61. 旋转链表

原文:https://www.cnblogs.com/HuangYJ/p/14135680.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!