鍊錶分割問題

2021-07-15 03:29:06 字數 1087 閱讀 2748

題目:編寫**,以給定的x為基準值將鍊錶分割成兩部分,所有小於x的結點排在大於或等於x的結點之前。

解法一:交換結點法,回想學習快速排序的時候,也是以基準值將一組數劃分成兩部分,小於基準值的排在前面,大於基準值的排在後半部分。因此解決這個問題也可以使用兩個指標。如果煉表頭結點開始遍歷,第乙個需要移動的結點是第乙個大於或等於基準值的結點,例如鍊錶1->3->6->7->2->1->5,基準值設為4,那麼第乙個指標滑到6的時候應該停止,它需要被交換到後面,因為6前面的結點值都是小於基準值的,所以和它交換的結點應該在它後面,需要找到乙個小於基準值的結點交換到前面去,於是找到了結點2。交換結點6和2。然後兩個指標同時後移一位,在尋找需要交換的結點過程中指標一直滑到鍊錶結尾時,表明鍊錶中已經沒有需要交換的結點,這時候直接返回,迴圈結束。

void partition(listnode* phead, int n)

pnext = pcurr;

while(pnext->m_nvalue >= n)

while(pcurr != null && pnext != null)

while(pnext->m_nvalue >= n)

int tmp = pcurr->m_nvalue;

pcurr->m_nvalue = pnext->m_nvalue;

pnext->m_nvalue = tmp;

pcurr = pcurr->m_pnext;

pnext = pnext->m_pnext;

}}

解法二:先分割再合併。建立兩個鍊錶,before和after,before儲存小於基準值的結點,after儲存大於或等於基準值的結點,最後將兩個鍊錶合併。

void partition(listnode** phead, int n)

else

}else

else

}pnode = node;

} if(beforehead == null)

beforeend->m_pnext = afterhead;

*phead = beforehead;

}

11 鍊錶分割

編寫 以給定值x為基準將鍊錶分割成兩部分,所有小於x的結點排在大於或等於x的結點之前 給定乙個鍊錶的頭指標 listnode phead,請返回重新排列後的鍊錶的頭指標。注意 分割以後保持原來的資料順序不變。public listnode partition listnode phead,int x...

leecode分割鍊錶

給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5 解題思路 該題相當於乙個分類問題,基於給定引數x分大和小。基於示例解...

《leetCode php》分割鍊錶

給出乙個鍊錶和乙個值x,以x為參照將鍊錶劃分成兩部分,使所有小於x的節點都位於大於或等於x的節點之前。兩個部分之內的節點之間要保持的原始相對順序。例如 給出1 4 3 2 5 2和x 3,返回1 2 2 4 3 5 class node function partition head,x else ...