學渣帶你刷Leetcode0086分隔鏈表

題目描述

給定一個鏈表和一個特定值 x,對鏈表進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。

你應當保留兩個分區中每個節點的初始相對位置。

示例:

輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/partition-list
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

白話題目:
 

算法:

 

詳細解釋關注 B站  【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB

C語言完全代碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

//方法一:指針操作
struct ListNode* partition(struct ListNode* head, int x){
    bool                    bFlag       = false;
    struct ListNode*        pHead       = NULL;
    struct ListNode*        pCurNode    = NULL;
    struct ListNode*        pExchange   = NULL;
    struct ListNode*        pTmpNode    = NULL;
    struct ListNode*        pNextNode   = NULL;

    //1,建立頭點,方便後續操作
    pHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    pHead->val = 0;
    pHead->next = head;

    pCurNode = pHead;
    pExchange = pHead;
    pNextNode = pCurNode->next;

    while(pNextNode != NULL)
    {
        if((!bFlag) && (pNextNode->val >= x))
        {
            pExchange = pCurNode;
            bFlag = true;

            pCurNode = pCurNode->next;
            pNextNode = pCurNode->next;
        }
        else
        {
            if((bFlag) && (pNextNode->val < x))
            {
                //將 pNextNode 節點移動到 pExchange 後面
                pCurNode->next = pNextNode->next;
                pNextNode->next = pExchange->next;
                pExchange->next = pNextNode;
                pExchange = pExchange->next;
                pNextNode = pCurNode->next;
            }
            else
            {
                pCurNode = pCurNode->next;
                pNextNode = pCurNode->next;
            }
        }
    }
    return pHead->next;
}



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章