LeetCode-025-K 個一組翻轉連結串列
阿新 • • 發佈:2021-06-29
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; } } }
【每日寄語】 不是每一個貝殼裡都有珍珠,但珍珠一定出現在貝殼中,不是每個人努力都會成功,但成功的人一定很努力。