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

 

posted @ 2020-12-15 10:20  不学无墅_NKer  阅读(73)  评论(0编辑  收藏  举报