[每日一題]25. Reverse Nodes in k-Group

2021-03-02 每日一道算法題
25. Reverse Nodes in k-Group

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

For example, Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

題目解析

這道題的難度是 Hard, 是對我們這一周鍊表練習的一次檢測。

題目的意思是要我們將一個鍊表分成 n / k 個部分,如果 n / k > k 那麼則翻轉。舉了一個例子: k = 2, linked: 1 -> 2 -> 3 -> 4 -> 5

上面的鍊表可以分成 3 個部分: 1 -> 2, 3 -> 4, 5:

翻轉 1 -> 2 得 2 -> 1

翻轉 3 -> 4 得 4 -> 3

因為 5 只有一個節點,不需要翻轉

期望結果 2 -> 1 -> 4 -> 3 -> 5

由上面的分析,我們將這個複雜的問題分成兩個子問題:

鍊表如何分組?

分組的思路很簡單: 用一個數字標記當前節點的位置。

count = 1 while head && count < k do head = head.next count += 1 end

上面的代碼非常容易的獲取鍊表的前 k 個節點,結合遞歸或者循環,就能非常容易的分組了。

鍊表如何反轉?

反轉的思路: 兩個指針: 當前指針 和 前指針 ,通過不斷的操作指針的節點和指針來反轉鍊表。

收錄的部分代碼

@fzy 提交的 Java 代碼: 思路非常清晰,代碼簡潔。

@Gerrold_Gao 提交的 python 代碼: 簡潔,鍊表反轉只有一行代碼

相關issue

https://leetcode.com/problems/swap-nodes-in-pairs

這道題只是中等難度,只是本題的k = 2的一種特殊情況。 @小小鵝 的解決方案特別的好,所以也記錄下來。

鍊表問題的總結

鍊表問題考察最多的是對指針的靈活運用。比如交換鍊表的位置,遞歸,排序等問題,都需要我們熟練的使用指針。有時候畫一張簡單的圖可以簡化我們的思考,幫助我們找到可能的方案。 下面總結的問題和方法都是非常經典的,可以作為學習鍊表的大綱。

鍊表問題可以歸為如下幾種類型:

解題方法有:

指針

環路: 將單向鍊表連接成環

遞歸

二分法

分治算法

Dummy 節點: 簡化對head節點的處理

相關焦點

  • LeetCode-25.K個一組翻轉鍊表(Reverse Nodes in k-Group)
    這道題是前面Swap Nodes in Pairs的Follow-up25.
  • ​LeetCode刷題實戰25:K 個一組翻轉鍊表
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做K 個一組翻轉鍊表,我們先來看題面:https://leetcode-cn.com/problems/reverse-nodes-in-k-groupGiven a linked list, reverse the nodes of a linked list k at a time and return its
  • 一文搞懂《鍊表反轉》
    LeetCode 同樣有原題官方難度為 Hard。題目描述給你一個鍊表,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊表。k 是一個正整數,它的值小於或等於鍊表的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。
  • leetcode每日一題:49.字母異位詞分組
    leetcode每日一題:49.字母異位詞分組:https://leetcode-cn.com/problems/group-anagrams/一起刷題吧一、題意分析 輸入:由字符串組成的列表(數組)輸出:將由同樣的字母和字母個數組成的不同序列放在一個列表裡,然後整體做為一個列表輸出難度
  • 每日一練 | Data Scientist & Business Analyst & Leetcode 面試題 979
    自2017年10月4日起,每天再為大家分享一道Leetcode 算法題。希望積極尋求相關領域工作的你每天關注我們的問題並且與我們一起思考,我們將會在第二天給出答案。Describe the basic steps to do the PCA (Principal Components Analysis.
  • [每日一題]131. Palindrome Partitioning
    每日一題]162.Find Peak Element[每日一題]410. Split Array Largest Sum[每日一題]209. Minimum Size Subarray Sum[每日一題]240. Search a 2D Matrix II[每日一題]74.
  • 【每日一題】643. 子數組最大平均數 I
    各位題友大家好,今天是每日算法題公眾號堅持日更的第 11 天。今天力扣上的每日一題是第 643 題「子數組最大平均數 I」。可以通過每日一題的小程序查看題目詳情:題目大意給定 n 個整數,找出平均數最大且長度為 k 的連續子數組,並輸出該最大平均數。
  • 網際網路大廠算法面試題集合,看完我跪了!
    來源:https://github.com/azl397985856/leetcode介紹leetcode 題解
  • 《火影忍者》11月25日每日一題答案是什麼 ...
    > 導 讀 火影忍者是由集英社官方授權的同名動作遊戲,在這款遊戲中玩家可以通過操控火影忍者漫畫中的各位角色進行與強敵的戰鬥,這款遊戲中的每日一題活動能夠讓玩家每日進行答題
  • 【每日一題】(31題)面試官:你對圖論了解多少?(一)
    關注「松寶寫代碼」精選好文,每日一題作者:Overstarshttps://shuangxunian.gitee.io
  • Leecode題解 :7. Reverse Integer
    題目分析題目意思,要求反轉一個數字,如果反轉後超過32位表示,則輸出0解題思路(1)這道題非常簡單CPP代碼class Solution {public:    int reverse(int x) {       long long  int s = 0;              //它有可能會超過int的值        while
  • 【每日一題】(33題)面試官:你對圖論了解多少?(三)
    一、前言2020.12.23 立的 flag,每日一題,題目類型不限制,涉及到JavaScript,Node,Vue,React,瀏覽器,http,算法等領域。本文是:【每日一題】(33題)面試官:你對圖論了解多少?(三)每日一題前兩期:【每日一題】(32題)面試官:你對圖論了解多少?
  • 衝擊中考數學滿分每日一題(11)
    =k.(1)點D與點B重合時,①如圖1,k=1時,AE和FC的數量關係是      ,位置關係是    ;②如圖2,k=2時,猜想AE和FC的關係,並說明理由;(2)BD=2CD時,①如圖3,k=1時,若AE=2,S△CDF=6,求FC的長度;②如圖4,k=2時,點M、N分別為EF和AC的中點,若AB=10,直接寫出MN的最小值.
  • [每日一題]如何判斷一棵樹是 BST ?
    本周主題:DFS本題難度:Medium做題日期:2017年4月17日98.
  • python大戰leetcode(一)
    : int) -> List[int]: track = {} for i, n in enumerate(nums): if n not in track: track[n] = [i] else: track[n].append(i) for k
  • 每日一練 | Data Scientist & Business Analyst & Leetcode 面試題 1043
    自2017年10月4日起,每天再為大家分享一道Leetcode 算法題。希望積極尋求相關領域工作的你每天關注我們的問題並且與我們一起思考,我們將會在第二天給出答案。Explain what is collaborative filtering?