1. 程式人生 > 其它 >LeetCode-025-K 個一組翻轉連結串列

LeetCode-025-K 個一組翻轉連結串列

K 個一組翻轉連結串列

題目描述:給你一個連結串列,每 k 個節點一組進行翻轉,請你返回翻轉後的連結串列。

k 是一個正整數,它的值小於或等於連結串列的長度。

如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。

進階:

你可以設計一個只使用常數額外空間的演算法來解決此問題嗎?
你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:利用棧
  • 首先,如果k=1或者head為空或者head沒有後繼節點,直接返回空;
  • 否則,遍歷head連結串列,利用一個棧kListNode,每次把k個節點推入棧中,然後再依次把k個節點從棧中取出,並且連結串列按取出的順序排列,這樣直到把連結串列遍歷完成,即完成的所有節點的翻轉。

注意點:開始記錄了一個空節點newHead記錄頭結點,這樣當遍歷完成後直接返回newHead的下一個節點即為翻轉後的頭節點。

import java.util.Stack;

public class LeetCode_025 {
    public static ListNode reverseKGroup(ListNode head, int k) {
        if (k == 1 || head == null || head.next == null) {
            return head;
        }

        ListNode newHead;
        ListNode pre = new ListNode(-1);
        newHead = pre;
        pre.next = head;
        int count = 0;
        ListNode next = head;
        Stack<ListNode> kListNode = new Stack<>();
        while (next != null || count == k) {
            if (count == k) {
                while (!kListNode.isEmpty()) {
                    pre.next = kListNode.pop();
                    pre = pre.next;
                }
                pre.next = next;
                count = 0;
            } else {
                if (next != null) {
                    kListNode.push(next);
                    next = next.next;
                    count++;
                }
            }
        }
        return newHead.next;
    }

    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(3);
        head.next.next.next = new ListNode(4);
        head.next.next.next.next = new ListNode(5);
        ListNode result = reverseKGroup(head, 3);
        while (result != null) {
            System.out.print(result.val + " ");
            result = result.next;
        }
    }
}

【每日寄語】 不是每一個貝殼裡都有珍珠,但珍珠一定出現在貝殼中,不是每個人努力都會成功,但成功的人一定很努力。