鏈表劃分

来源:https://www.cnblogs.com/xushuwuxingqu/archive/2022/04/17/16154971.html
-Advertisement-
Play Games

描述給定一個單鏈表和數值x,劃分鏈表使得所有小於x的節點排在大於等於x的節點之前。你應該保留兩部分內鏈表節點原有的相對順序。 樣例 1: 輸入: list = null x = 0 輸出: null 解釋: 空鏈表本身滿足要求 樣例 2: 輸入: list = 1->4->3->2->5->2->n ...


描述
給定一個單鏈表和數值x,劃分鏈表使得所有小於x的節點排在大於等於x的節點之前。你應該保留兩部分內鏈表節點原有的相對順序。

樣例 1輸入:

list = null
x = 0
輸出:

null
解釋:

空鏈表本身滿足要求
樣例 2:

輸入:

list = 1->4->3->2->5->2->null
x = 3
輸出:

1->2->2->4->3->5->null
解釋:

要保持原有的相對順序。

 題解

/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param head: The first node of linked list
     * @param x: An integer
     * @return: A ListNode
     */
    ListNode* partition(ListNode *head, int x) {
        // write your code here
        
        if(head == NULL)
        {
            return head;
        }
        // sH和sT指向同一段鏈表,sH一直指向這段鏈表的頭,然後依靠sT來為這段鏈表添加新節點;
        ListNode *sH = NULL; //small head;
        ListNode *sT = NULL; //small tail;
        // ListNode *eH = NULL; //equal head;
        // ListNode *eT = NULL; //equal tail;
        // ListNode *mH = NULL; //big head;
        // ListNode *mT = NULL; //big tail;
        //同理, meH和meT指向同一段鏈表,meH一直指向這段鏈表的頭,然後依靠meT來為這段鏈表添加新節點;
        ListNode *meH = NULL;
        ListNode *meT = NULL;

        ListNode *next = NULL; //save next ListNode
        // every ListNode distributed to three lists
        //以輸入list=1->4->3->2->5->2->null;x=3為例
        while(head != NULL)
        {
            next = head->next;
            // 可以看到每次插入的head都是一個節點,其next為NULL;
            head->next = NULL;
            if(head->val < x)
            {
                if(sH == NULL)
                {
                    //sH和sT指向同一個當前head,其val為1
                    sH = head;
                    sT = head;
                }
                else
                {
                    //sT的下一個為2,即1->2,記住此時只是改變了sT,但是sH一直都指向這段鏈表的首端,其值為1;
                    sT->next = head;
                    // 改變sT,使其指向新插入的鏈表,新鏈表其值為2;
                    sT = head;
                }
            }
            // else if(head->val == x)
            else
            {
                if(meH == NULL)
                {
                    //meH和meT指向同一個當前head,其val為4
                    meH = head;
                    meT = head;
                }
                else
                {
                    //meT的下一個為3,即4->3,記住此時只是改變了meT,但是meH一直都指向這段鏈表的首端,其值為4;
                    meT->next = head;
                    // 改變sT,使其指向新插入的鏈表,新鏈表其值為3;
                    meT = head;
                }
            }
            // else
            // {
            //     if(mH == NULL)
            //     {
            //         mH = head;
            //         mT = head;
            //     }
            //     else
            //     {
            //         mT->next = head;
            //         mT = head;
            //     }
            // }
            head = next;
        }

        //small and equal reconnect
        if(sT != NULL)//如果有小於x的區域
        {
            sT->next = meH;
            // eT = eT==NULL?sT:eT; //下一步,誰去連大於x區域的頭,誰就變成eT;
        }
        //上面的if,不管運行了沒有,eT
        //all reconnect
        // if(eT != NULL)  //如果小於x的區域和等於x的區域,不是都沒有
        // {
        //     eT->next =  mH;
        // }
        // return sH != NULL ? sH : (eH != NULL ? eH : mH);
        return (sH != NULL ? sH : meH);
    }
};

 

非淡泊無以明志,非寧靜無以致遠!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HashMap<Integer, String> map = new HashMap<>();map.put(11,"張三");map.put(12,"李四");map.put(13,"王五");map.put(12,"趙六");map.put(14,"陳皮");System.out.println ...
  • Java 8 之前,介面裡面只能寫抽象方法,不能寫實現方法 Java 8 開始是可以有方法實現的,可以在介面中添加預設方法和靜態方法 預設方法用 default 修飾,只能用在介面中,靜態方法用 static 修飾,並且介面中的預設方法、靜態方法可以同時有多個。 為什麼要用介面預設方法 舉一個很現實 ...
  • 一、環境安裝及配置 引用鏈接:Go語言環境安裝及配置 Go版本安裝 百度網盤msi地址:版本v1.18.1提取碼:m1mc GoLand工具 鏈接:【版本2020.1】提取碼:7x9o 2.1、安裝流程 goland-2020.1.exe安裝 2.2、破解 先下載壓縮包解壓後得到jetbrains- ...
  • 這篇文章我們來介紹一下 super,我相信大部分的人使用 super 都是使用這種方式; # 就是我有一個 class 比如說是 Male,然後繼承另外一個 class 比如是 Person,然後我在這個 Male 也就是它的子類的 init 函數裡面用 super().__init__() 來調用 ...
  • 各種鎖 可重入鎖、公平鎖\非公平鎖、獨占鎖\共用鎖、讀寫鎖 鎖狀態 重量級鎖、輕量級鎖、偏量鎖、鎖膨脹、鎖粗化、鎖自旋\自定義自旋 volatile輕量級鎖,鎖變數,可見性 synchronized使用方式,不同使用方式的底層實現,非公平鎖,鎖升級原理,鎖優化,降級 單例模式與synchronize... ...
  • 1. 概念 1.1 此次編寫字元串的查找和字元串的統計 1.2 編寫字元串常用的方法 1.2.1 string.isspace() 如果string中只包含空格,則返回true 1.2.2 string.isalnum() 如果string至少有一個字元並且所有字元都是字母或者數字則返回true 1 ...
  • 本章將和大家分享ASP.NET Core 中間件(Middleware)的使用及其源碼解析。 ...
  • 緣起 概述:發現現如今網上關於Java、前端、Android、Golang...等相關技術的學習資料,面試指南一搜都是一大把,但是我們大.NET/C#的相關學習資料,面試指南和一些常見的面試題都是寥寥無幾,並不是沒有人寫,而是因為網上的資料和文章太零散了,缺少一個彙總的知識庫。因此作為.NET開發中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...