template
<
typename t>
singlylinkednode
*partition
(singlylinkednode
* head, t partition)
singlylinkednode
* newhead = head;
singlylinkednode
* newtail = head;
singlylinkednode
* currentnode = head;
singlylinkednode
* nextnode =
nullptr
;while
(currentnode !=
nullptr
)else
currentnode=nextnode;
}return newhead;
}
演算法從頭結點開始,如果當前節點的值小於x的值則將該節點的nex
tnext
next
值設定為new
head
newhead
newhea
d,newh
eadnewhead
newhea
d重新賦值為該節點指標。如果當前節點的值大於x的值則將new
tail
newtail
newtai
l的next
next
next
值賦值為該節點的指標,new
tail
newtail
newtai
l重新賦值為該節點指標。該演算法乙個簡單的例子如圖1所示。可以看出調整完之後節點1、2和3的順序為1->2->3,而調整前節點1、2和3的順序為3->2->1,因此該演算法為不穩定演算法。
該演算法的時間複雜度為o(n),n為鍊錶中節點的個數。空間複雜度為優化為o(1)。
圖1.
//穩定演算法//
template
<
typename t>
singlylinkednode
*partition
(singlylinkednode
* head, t partition)
singlylinkednode
* beforestart =
nullptr
; singlylinkednode
* beforeend =
nullptr
; singlylinkednode
* afterstart =
nullptr
; singlylinkednode
* afterend =
nullptr
; singlylinkednode
* currentnode= head;
while
(currentnode !=
nullptr
)else
}else
else
} currentnode=nextnode;}if
(beforestart==nullptr)
if(afterstart!=nullptr)
beforeend.
setnext
(afterstart)
;return beforestart;
}
該演算法為穩定演算法。演算法首先建立兩個鍊錶,將小於par
titi
onpartition
partit
ion的節點放到前乙個鍊錶中,將大於等於par
titi
onpartition
partit
ion的節點放到後乙個鍊錶中。最後將這兩個鍊錶鏈結起來即為最後的結果鍊錶。
該演算法的時間複雜度為o(n),n為鍊錶中節點的個數。空間複雜度為優化為o(1)。
86 分割鍊錶
給定乙個鍊錶和乙個特定值x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5 思路 用兩個鍊錶分別存小於x和大於等於x的元素,然後連線兩個鍊錶。de...
LeetCode725分割鍊錶
題目 給定乙個頭結點為 root 的鍊錶,編寫乙個函式以將鍊錶分隔為 k 個連續的部分。每部分的長度應該盡可能的相等 任意兩部分的長度差距不能超過 1,也就是說可能有些部分為 null。這k個部分應該按照在鍊錶 現的順序進行輸出,並且排在前面的部分的長度應該大於或等於後面的長度。返回乙個符合上述規則...
LeetCode 725 分割鍊錶
鍊錶中比較常規的一道題 取整,取餘,雙指標的應用 自己寫的 有些長,但是執行4ms結束,超過100 class solution int len k len k int num plus len k listnode head root 當前的這一段的頭節點 listnode prev nullpt...