題目描述
給定一個鏈表和一個特定值 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;
}