LeetCode:25. K 个一组翻转链表

2022-02-21  本文已影响0人  alex很累

问题链接

25. K 个一组翻转链表

问题描述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

进阶:

示例

解题思路

核心:模拟、链表、指针变换
这道题没有什么复杂的算法,不知道为什么会将难度认定为“困难”。
每次从链表中取k个节点,取出后进行翻转再放回链表;然后再取k个节点...... 如果后面的节点不足k个,结束。

关于翻转的做法:

  1. 把这k个节点放到list里面,然后从后往前的顺序取节点。
  2. 纯指针。

代码示例(JAVA)

list

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode preHead = new ListNode(-1);
        preHead.next = head;
        ListNode temp = preHead;

        ListNode cur = head;
        while (cur != null) {
            // 数量校验 、 存下数据到list
            ListNode valid = cur;
            List<ListNode> list = new ArrayList<>();
            for (int i =0; i < k; i++) {
                if (valid == null) {
                    return preHead.next;
                }
                list.add(valid);
                valid = valid.next;
            }
            // 翻转k个节点
            for (int j = list.size() - 1; j >= 0; j--) {
                temp.next = list.get(j);
                temp = temp.next;
            }
            temp.next = valid;
            cur = valid;
        }

        return preHead.next;
    }
}

执行结果

纯指针

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode preHead = new ListNode(-1);
        preHead.next = head;
        ListNode temp = preHead;

        while (head != null) {
            // 数量校验
            ListNode tail = temp;
            for (int i =0; i < k; i++) {
                tail = tail.next;
                if (tail == null) {
                    return preHead.next;
                }
            }

            // 翻转数据
            ListNode next = tail.next;
            ListNode[] nodeArr = reverse(head, tail);
            temp.next = nodeArr[0];
            nodeArr[1].next = next;
            temp = nodeArr[1];
            head = nodeArr[1].next;
        }

        return preHead.next;
    }

    public ListNode[] reverse(ListNode head, ListNode tail) {
        ListNode after = tail.next;
        ListNode temp = head;
        while (after != tail) {
            ListNode next = temp.next;
            temp.next = after;
            after = temp;
            temp = next;
        }
        return new ListNode[]{tail, head};
    }
}

执行结果

上一篇下一篇

猜你喜欢

热点阅读