2 4 分割鍊錶

2021-10-03 11:05:54 字數 2097 閱讀 9228

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...